[][src]Macro comprehension::iter

macro_rules! iter {
    ($val:expr; $var:ident <- $it:expr $(, $($rest:tt)*)?) => { ... };
    ($val:expr; let $p:pat = $e:expr $(, $($rest:tt)*)?) => { ... };
    ($val:expr; $pred:expr $(, $($rest:tt)*)?) => { ... };
    ($val:expr; ) => { ... };
}

Iterator comprehension

The syntax is similar to Haskell's list comprehension.

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

Examples

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

use comprehension::iter;

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

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

use comprehension::iter;

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> pattern introduces a binding.

use comprehension::iter;

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).

use comprehension::iter;

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