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
75
76
77
78
79
80
81
82
use self::connection::*;
use super::*;
use crossbeam::channel::{RecvError, RecvTimeoutError, TryRecvError};

/// The Receiver is a wrapper aruond the Crossbeam receiver. It
/// intentionally limits the surface of the receiver. Much of this
/// is just boilerplate wrapping
pub struct Receiver<T>
where
    T: MachineImpl,
{
    channel_id: usize,
    connection: ThreadSafeConnection,
    pub receiver: crossbeam::channel::Receiver<T>,
}

impl<T> Receiver<T>
where
    T: MachineImpl,
{
    pub fn get_id(&self) -> usize { self.channel_id }
    pub fn clone_receiver(&self) -> crossbeam::channel::Receiver<T> { self.receiver.clone() }
    pub fn receiver(&self) -> &crossbeam::channel::Receiver<T> { &self.receiver }

    pub fn try_recv(&self) -> Result<T, TryRecvError> { self.receiver.try_recv() }

    pub fn recv(&self) -> Result<T, RecvError> { self.receiver.recv() }

    pub fn recv_timeout(&self, timeout: std::time::Duration) -> Result<T, RecvTimeoutError> { self.receiver.recv_timeout(timeout) }

    pub fn is_empty(&self) -> bool { self.receiver.is_empty() }

    pub fn is_full(&self) -> bool { self.receiver.is_full() }

    pub fn len(&self) -> usize { self.receiver.len() }

    pub fn capacity(&self) -> Option<usize> { self.receiver.capacity() }

    pub fn iter(&self) -> crossbeam::channel::Iter<'_, T> { self.receiver.iter() }

    pub fn try_iter(&self) -> crossbeam::channel::TryIter<'_, T> { self.receiver.try_iter() }
}

impl<T> Clone for Receiver<T>
where
    T: MachineImpl,
{
    fn clone(&self) -> Self {
        Self {
            channel_id: self.channel_id,
            connection: self.connection.clone(),
            receiver: self.receiver.clone(),
        }
    }
}

impl<T> fmt::Debug for Receiver<T>
where
    T: MachineImpl,
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.receiver.fmt(f) }
}

impl<T> PartialEq for Receiver<T>
where
    T: MachineImpl,
{
    fn eq(&self, other: &Self) -> bool { self.channel_id == other.channel_id && self.receiver.same_channel(&other.receiver) }
}

impl<T> Eq for Receiver<T> where T: MachineImpl {}

pub fn wrap_receiver<T>(receiver: crossbeam::channel::Receiver<T>, channel_id: usize, connection: ThreadSafeConnection) -> Receiver<T>
where
    T: MachineImpl,
{
    Receiver::<T> {
        channel_id,
        connection,
        receiver,
    }
}