pusherator/
map.rs

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