1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use std::cell::UnsafeCell;
use std::rc::Rc;
use std::os::raw::c_void;

use crate::Sender;
use crate::priv_traits::*;
use crate::{stream, Stream};


pub enum Either<T1, T2>{
    Left(T1),
    Right(T2),
    Both(T1, T2),
    None,
}

pub struct PartitionMap<'a, T1, T2, F>{
    func: F,
    left: Sender<'a,T1>,
    right: Sender<'a,T2>,
}

impl<'a, T1, T2: 'a, F> PartitionMap<'a,T1,T2,F>{
    pub fn new(f: F) -> (PartitionMap<'a,T1,T2,F>, Stream<'a, T2>){
        let (sender_right, stream_right) = stream();
        let filter = PartitionMap{
            func: f,
            left: Sender::new(),
            right: sender_right,
        };
        (filter, stream_right)
    }
}

impl<'a, T1, T2, F> StreamInner<'a,T1> for PartitionMap<'a,T1,T2,F> {
    #[inline]
    fn push(&mut self, st: Rc<UnsafeCell<dyn SinkInner<'a,T1>+'a>>){
        self.left.push(st)
    }

    #[inline]
    fn send(&mut self, t: T1){
        self.left.send(t)
    }
}

impl<'a,T1, T2, F> Remove for PartitionMap<'a,T1,T2,F>{
    fn remove_raw(&mut self, st: *const c_void){
        self.left.remove_raw(st)
    }
}

impl<'a, T, T1, T2, F> SinkInner<'a, T> for PartitionMap<'a,T1,T2,F>
where F: FnMut(T) -> Either<T1, T2>
{
    #[inline]
    fn call(&mut self, t: T) -> Result<(),()>{
        match (self.func)(t) {
            Either::Left(t1) => self.left.send(t1),
            Either::Right(t2) => self.right.send(t2),
            Either::Both(t1, t2) => {
                self.left.send(t1);
                self.right.send(t2);
            }
            Either::None => (),
        }
        Ok(())
    }

    #[inline]
    fn is_alive(&self) -> bool {
        true
    }
}