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}