1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::{Generator, ValueResult, GeneratorResult};
pub struct Filter<Gen, Pred>
{
generator: Gen,
predicate: Pred,
}
impl<Gen, Pred> Filter<Gen, Pred>
where
Gen: Generator,
Pred: FnMut(&Gen::Output) -> bool
{
pub(crate) fn new(generator: Gen, predicate: Pred) -> Self {
Self {
generator,
predicate
}
}
}
impl<Gen, Pred> Generator for Filter<Gen, Pred>
where
Gen: Generator,
Pred: FnMut(&Gen::Output) -> bool
{
type Output = Gen::Output;
#[inline]
fn run(&mut self, mut output: impl FnMut(Self::Output) -> ValueResult) -> GeneratorResult {
let (generator, predicate) = (&mut self.generator, &mut self.predicate);
generator.run(move |x| {
if predicate(&x) {
output(x)
}
else {
ValueResult::MoreValues
}
})
}
}