pusherator/
filter_map.rs

1use std::marker::PhantomData;
2
3use super::{Pusherator, PusheratorBuild};
4
5pub struct FilterMap<Next, Func, In> {
6    next: Next,
7    func: Func,
8    _marker: PhantomData<fn(In)>,
9}
10impl<Next, Func, In> Pusherator for FilterMap<Next, Func, In>
11where
12    Next: Pusherator,
13    Func: FnMut(In) -> Option<Next::Item>,
14{
15    type Item = In;
16    fn give(&mut self, item: Self::Item) {
17        if let Some(item) = (self.func)(item) {
18            self.next.give(item);
19        }
20    }
21}
22impl<Next, Func, In> FilterMap<Next, Func, In>
23where
24    Next: Pusherator,
25    Func: FnMut(In) -> Option<Next::Item>,
26{
27    pub fn new(func: Func, next: Next) -> Self {
28        Self {
29            next,
30            func,
31            _marker: PhantomData,
32        }
33    }
34}
35
36pub struct FilterMapBuild<Prev, Func>
37where
38    Prev: PusheratorBuild,
39{
40    prev: Prev,
41    func: Func,
42}
43impl<Prev, Func, Out> FilterMapBuild<Prev, Func>
44where
45    Prev: PusheratorBuild,
46    Func: FnMut(Prev::ItemOut) -> Option<Out>,
47{
48    pub fn new(prev: Prev, func: Func) -> Self {
49        Self { prev, func }
50    }
51}
52impl<Prev, Func, Out> PusheratorBuild for FilterMapBuild<Prev, Func>
53where
54    Prev: PusheratorBuild,
55    Func: FnMut(Prev::ItemOut) -> Option<Out>,
56{
57    type ItemOut = Out;
58
59    type Output<O: Pusherator<Item = Self::ItemOut>> =
60        Prev::Output<FilterMap<O, Func, Prev::ItemOut>>;
61    fn push_to<O>(self, input: O) -> Self::Output<O>
62    where
63        O: Pusherator<Item = Self::ItemOut>,
64    {
65        self.prev.push_to(FilterMap::new(self.func, input))
66    }
67}