macro_rules! iproduct {
    (@flatten $I:expr,) => { ... };
    (@flatten $I:expr, $J:expr, $($K:expr,)*) => { ... };
    ($I:expr) => { ... };
    ($I:expr, $J:expr) => { ... };
    ($I:expr, $J:expr, $($K:expr),+) => { ... };
}
Expand description

Create an iterator over the “cartesian product” of iterators.

Iterator element type is like (A, B, ..., E) if formed from iterators (I, J, ..., M) with element types I::Item = A, J::Item = B, etc.

// Iterate over the coordinates of a 4 x 4 x 4 grid
// from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3)
for (i, j, k) in iproduct!(0..4, 0..4, 0..4) {
   // ..
}