[][src]Macro comprehension::iter

iter!() { /* proc-macro */ }

Iterator comprehension

The syntax is similar to Haskell's list comprehension.

Basic syntax is as: [<expr>; <quals>, ...]

Examples

<pat> <- <expr> binds items of expr to pat. expr must have .into_iter() method.

iter![x * x; x <- 0..10];
// => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

You can also use patterns.

iter![x * y; (x, y) <- vec![(1, 1), (2, 3), (4, 5)]];
// => [1, 6, 20]

<expr> filters item. expr must have type bool.

fn gcd(a: i32, b: i32) -> i32 {
    if b == 0 { a } else { gcd(b, a % b) }
}

iter![(i, j); i <- 1.., j <- 1..i, gcd(i, j) == 1].take(10);
// => [(1, 1), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

let <pat> = <expr> introduces a binding.

iter![(i, j); i <- 1.., let k = i * i, j <- 1..=k].take(10);
// => [(1, 1), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]

If there is no binding to iterator, just one element will be returned (same as Haskell's behaviour).

iter![1; ];      // => [1]
iter![1; false]; // => []
iter![1; true];  // => [1]