[−][src]Macro comprehension::iter
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]