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
43
44
45
use crate::grind::{Chisel, Grinder};
pub struct Filter<T: Grinder, F> {
inner: T,
func: F,
}
impl<T, F> Filter<T, F>
where
T: Grinder,
{
pub fn new(inner: T, func: F) -> Filter<T, F> {
Filter {
inner: inner,
func: func,
}
}
}
impl<T, F> Grinder for Filter<T, F>
where
T: Grinder,
F: Fn(&<T::Item as Chisel>::Value) -> bool,
{
type Item = T::Item;
type Error = T::Error;
fn emit(&mut self, err: Self::Error) {
self.inner.emit(err)
}
fn next(&mut self) -> Self::Item {
loop {
let n = self.inner.next();
if match n.value_ref() {
Some(v) => (self.func)(v),
None => true,
} {
return n;
}
}
}
}