Macro iter_python::iter[][src]

macro_rules! iter {
    ($($input : tt) *) => { ... };
}
Expand description

(shortname: i!) — Write the most pervasive iterator adapters (filtering and mapping) as Python generator expressions.

Examples

Squaring even numbers

use ::iter_python::prelude::*;

let mut all_evens_squared = i!(
    x * x
    for x in (0 ..)
    if x % 2 == 0
);
assert_eq!(all_evens_squared.next(), Some(0));
assert_eq!(all_evens_squared.next(), Some(4));
assert_eq!(all_evens_squared.next(), Some(16));

filtering is optional, such as in Python:

use ::iter_python::prelude::*;

let mut numbers_binary = i!(format!("{:02b}", x) for x in 1 ..= 3);

assert_eq!(numbers_binary.next(), Some("01".into()));
assert_eq!(numbers_binary.next(), Some("10".into()));
assert_eq!(numbers_binary.next(), Some("11".into()));
assert_eq!(numbers_binary.next(), None);

You may also filter with if let:

use ::iter_python::prelude::*;

let strings = ["42", "0", "zero", "27"];

let parsed_as_i32s = i!(s.parse::<i32>() for &s in &strings);

let total: i32 = Iterator::sum(i!(
    x
    for res in parsed_as_i32s
    if let Ok(x) = res
));

assert_eq!(total, 42 + 0 + 27);
use ::iter_python::prelude::*;

enum Fruit { Banana, Peach, RottenApple }
use Fruit::*;

impl Fruit {
    fn is_fresh (&self) -> bool
    {
        if let RottenApple = self {
            false
        } else {
            true
        }
    }
}

static BASKET: &[Fruit] = &[Banana, RottenApple, Peach, Banana];

let no_rotten_apple = i!(
    fruit
    for fruit in BASKET
    if let Banana | Peach = fruit
);

assert!({no_rotten_apple}.all(Fruit::is_fresh));

You can also nest / combine iterators

use ::iter_python::prelude::*;

assert_eq!(
    i!((i, j) for i in 0 .. 3 for j in 0 .. 2).vec(),
    vec![
        (0, 0),
        (0, 1),
        (1, 0),
        (1, 1),
        (2, 0),
        (2, 1),
    ],
);
With the same if guards as with the single case:
use ::iter_python::prelude::*;

assert_eq!(
    i!(
        (i, j)
        for i in 0 .. 4
        if i != 2
        for j in 0 .. i
        if j != 1
    ).vec(),
    vec![
        (1, 0),
        (3, 0),
        (3, 2),
    ]
)