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}