Announcing Cute.
What is it?
A Macro for python-esque list and hashmap comprehensions.
The c! macro implements list and hashmap comprehensions similar to those found in Python, allowing for conditionals and nested comprehensions.
Examples
#[macro_use(c)]
extern crate cute;
let squares = c![x*x, for x in 0..10];
let even_squares = c![x*x, for x in 0..10, if x % 2 == 0];
et squares_hashmap = c!{key => key*key, for key in 0..10};
Nested Comprehensions
let nested = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]];
let flat: Vec<usize> = c![x, for x in y, for y in nested];
assert_eq!(flat, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
With conditions
let nested = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]];
let even_flat: Vec<usize> = c![x, for x in y, for y in nested, if x % 2 == 0];
assert_eq!(even_flat, vec![2, 4, 6, 8]);
Comprehensions over Iterators
let vec: Vec<i32> = vec![-4, -2, 0, 2, 4];
let output: Vec<i32> = c![x*2, for x in vec.iter()];
assert_eq!(output, vec![-8, -4, 0, 4, 8]);
Hashmap Comprehensions
let v: Vec<(&str, i32)> = vec![("one", 1), ("two", 2), ("three", 3)];
let map = c! {key => val, for (key, val) in v, if val == 1 || val == 2};
let mut expected: HashMap<&str, i32> = HashMap::new();
expected.insert("one", 1);
expected.insert("two", 2);
assert_eq!(map, expected);