pusherator/
switch.rs

1use either::Either;
2
3use super::{Pusherator, PusheratorBuild};
4
5pub struct Switch<Next1, Next2> {
6    next1: Next1,
7    next2: Next2,
8}
9impl<Next1, Next2> Pusherator for Switch<Next1, Next2>
10where
11    Next1: Pusherator,
12    Next2: Pusherator,
13{
14    type Item = Either<Next1::Item, Next2::Item>;
15    fn give(&mut self, item: Self::Item) {
16        match item {
17            Either::Left(item1) => self.next1.give(item1),
18            Either::Right(item2) => self.next2.give(item2),
19        }
20    }
21}
22impl<Next1, Next2> Switch<Next1, Next2>
23where
24    Next1: Pusherator,
25    Next2: Pusherator,
26{
27    pub fn new(next1: Next1, next2: Next2) -> Self {
28        Self { next1, next2 }
29    }
30}
31
32pub struct SwitchBuild<Prev, Next1>
33where
34    Prev: PusheratorBuild,
35    Next1: Pusherator,
36{
37    prev: Prev,
38    next1: Next1,
39}
40impl<Prev, Next1, Item2> SwitchBuild<Prev, Next1>
41where
42    Prev: PusheratorBuild<ItemOut = Either<Next1::Item, Item2>>,
43    Next1: Pusherator,
44{
45    pub fn new(prev: Prev, next1: Next1) -> Self {
46        Self { prev, next1 }
47    }
48}
49impl<Prev, Next1, Item2> PusheratorBuild for SwitchBuild<Prev, Next1>
50where
51    Prev: PusheratorBuild<ItemOut = Either<Next1::Item, Item2>>,
52    Next1: Pusherator,
53{
54    type ItemOut = Item2;
55
56    type Output<Next: Pusherator<Item = Self::ItemOut>> = Prev::Output<Switch<Next1, Next>>;
57    fn push_to<Next>(self, input: Next) -> Self::Output<Next>
58    where
59        Next: Pusherator<Item = Self::ItemOut>,
60    {
61        self.prev.push_to(Switch::new(self.next1, input))
62    }
63}