Zip 3, 4, 5 or more Rust iterators
With Rust's stdlib you can only zip 2 iterators at a time:
```rust
let a: Vec
let abc = a.iter().zip(b.iter()).zip(c.iter()) .map(|((&aa, &bb), &cc)| aa+bb+cc); // (( , ), ) // ^~~~~~~~~~^~~~~~^ awkward!
let abcd = a.iter().zip(b.iter()).zip(c.iter()).zip(d.iter()) .map(|(((&aa, &bb), &cc), &dd)| aa+bb+cc+dd); // ((( , ), ), ) // ^~~~~~~~~~~^~~~~~^~~~~~^ ughhh! ```
With multizip
, you get a flattened version of zip
:
```rust
let abc = multizip::zip3(a.iter(),
b.iter(),
c.iter())
.map(|(&aa, &bb, &cc)| aa+bb+cc))
// ( , , )
// ^~~~~~~~~~~~~~^ oooh!
let abcd = multizip::zip4(a.iter(), b.iter(), c.iter(), d.iter()) .map(|(&aa, &bb, &cc, &dd)| aa+bb+cc+dd) // ( , , , ) // ^~~~~~~~~~~~~~~~~~~^ sweet! ```
TODO: upload to crates.io and update here with Cargo instructions.
Rust supports up to 12 variables in a single tuple, so the following are
implemented: zip2()
, zip3()
, zip4()
..., zip12()
.
If you need more than 12, something is probably wrong with your design. Consider something more appropriate than tuples.
multizip::zip2()
over std::iter::zip()
?The only advantage is the symmetry of arguments, e.g. zip2(a.iter(),
b.iter())
over a.iter().zip(b.iter())
.
Marc Dupont -- mdup.fr