comprehension 0.2.0

Iterator comprehension in Rust
Documentation
use comprehension::*;

#[test]
fn test_iter() {
    assert_eq!(vect![1; ], vec![1]);
    assert_eq!(vect![1; true], vec![1]);
    assert!(vect![1; false].is_empty());

    assert_eq!(
        vect![x * x; x <- 0..10],
        vec![0, 1, 4, 9, 16, 25, 36, 49, 64, 81],
    );

    assert_eq!(
        vect![x * y; x <- 1..=3, y <- 1..=3],
        vec![1, 2, 3, 2, 4, 6, 3, 6, 9],
    );

    assert_eq!(
        vect![x * y; x <- vec![1, 2, 3], y <- vec![1, 2, 3]],
        vec![1, 2, 3, 2, 4, 6, 3, 6, 9],
    );

    let mat = vec![vec![1, 2, 3]; 3];
    assert_eq!(
        vect![cell; row <- mat, cell <- row],
        vec![1, 2, 3, 1, 2, 3, 1, 2, 3],
    );

    assert_eq!(vect![x * x; x <- 0..10, x % 2 == 0], vec![0, 4, 16, 36, 64]);

    assert_eq!(
        vect![(*i, j); i <- &[1, 2], j <- 1..=3],
        vec![(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)],
    );

    assert_eq!(
        iter![(*i, j); i <- &[1, 2], j <- 1..]
            .take(5)
            .collect::<Vec<_>>(),
        vec![(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),],
    );

    assert_eq!(
        iter![vect![(*i, j); i <- &[1, 2] ]; j <- 1..]
            .take(5)
            .collect::<Vec<_>>(),
        vec![
            vec![(1, 1), (2, 1)],
            vec![(1, 2), (2, 2)],
            vec![(1, 3), (2, 3)],
            vec![(1, 4), (2, 4)],
            vec![(1, 5), (2, 5)],
        ],
    );

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

    assert_eq!(
        iter![(i, j); i <- 1.., j <- 1..i, gcd(i, j) == 1]
            .take(10)
            .collect::<Vec<_>>(),
        vec![
            (2, 1),
            (3, 1),
            (3, 2),
            (4, 1),
            (4, 3),
            (5, 1),
            (5, 2),
            (5, 3),
            (5, 4),
            (6, 1),
        ],
    );

    assert_eq!(
        iter![(i, j); i <- 1.., let k = i * i, j <- 1..=k ]
            .take(10)
            .collect::<Vec<_>>(),
        vec![
            (1, 1),
            (2, 1),
            (2, 2),
            (2, 3),
            (2, 4),
            (3, 1),
            (3, 2),
            (3, 3),
            (3, 4),
            (3, 5)
        ],
    );

    assert_eq!(
        iter![c.to_ascii_uppercase(); c <- "Hello".chars()].collect::<String>(),
        "HELLO"
    );

    assert_eq!(55, sum![i; i <- 1..=10]);
    assert_eq!(3628800, product![i; i <- 1..=10]);

    let t = vect![(x, y); x <- 1..=3, y <- 1..=3];
    assert_eq!(vect![x * y; (x, y) <- t], vec![1, 2, 3, 2, 4, 6, 3, 6, 9]);
}