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));
filter
ing 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),
]
)