1#[derive(Clone)]
2pub struct Sender<T> {
3 inner: InnerSender<T>,
4}
5#[derive(Clone)]
6pub enum InnerSender<T> {
7 SyncSender(std::sync::mpsc::SyncSender<T>),
8 Sender(std::sync::mpsc::Sender<T>)
9}
10
11pub struct Receiver<T> {
12 inner: std::sync::mpsc::Receiver<T>,
13}
14
15#[derive(PartialEq, Eq, Clone, Copy)]
16pub struct SendError<T>(pub T);
17
18#[derive(PartialEq, Eq, Clone, Copy)]
19pub struct RecvError;
20
21#[derive(PartialEq, Eq, Clone, Copy, Debug)]
22pub enum TryRecvError {
23 Empty,
26
27 Disconnected,
30}
31#[derive(PartialEq, Eq, Clone, Copy, Debug)]
32pub enum RecvTimeoutError {
33 Timeout,
36 Disconnected,
39}
40
41#[derive(PartialEq, Eq, Clone, Copy)]
42pub enum TrySendError<T> {
43 Full(T),
44 Disconnected(T)
45}
46
47
48
49impl<T> Sender<T> {
50 fn new_sync(sender : std::sync::mpsc::SyncSender<T>) -> Self {
51 Self {
52 inner : InnerSender::SyncSender(sender)
53 }
54 }
55 fn new(sender : std::sync::mpsc::Sender<T>) -> Self {
56 Self {
57 inner : InnerSender::Sender(sender)
58 }
59 }
60
61 pub fn send(&self, msg : T) -> Result<(), SendError<T>> {
62 let res = match &self.inner {
63 InnerSender::SyncSender(s) => s.send(msg),
64 InnerSender::Sender(s) => s.send(msg),
65 };
66 match res {
67 Ok(_) => Ok(()),
68 Err(e) => Err(e.into())
69 }
70 }
71
72 pub fn try_send(&self, msg : T) -> Result<(), TrySendError<T>> {
73 match &self.inner {
74 InnerSender::SyncSender(s) => match s.try_send(msg) {
75 Ok(_) => Ok(()),
76 Err(e) => Err(e.into())
77 },
78 InnerSender::Sender(s) => match s.send(msg) {
79 Ok(_) => Ok(()),
80 Err(e) => Err(e.into())
81 },
82 }
83 }
84}
85
86impl<T> Receiver<T> {
87 fn new(receiver : std::sync::mpsc::Receiver<T>) -> Self {
88 Self {
89 inner : receiver
90 }
91 }
92 pub fn recv(&self) -> Result<T, RecvError> {
93 match self.inner.recv() {
94 Ok(v) => Ok(v),
95 Err(e) => Err(e.into())
96 }
97 }
98 pub fn try_recv(&self) -> Result<T, TryRecvError> {
99 match self.inner.try_recv() {
100 Ok(v) => Ok(v),
101 Err(e) => Err(e.into())
102 }
103 }
104 pub fn recv_timeout(&self, duration : std::time::Duration) -> Result<T, RecvTimeoutError> {
105 match self.inner.recv_timeout(duration) {
106 Ok(v) => Ok(v),
107 Err(e) => Err(e.into())
108 }
109 }
110}
111
112pub fn sync_channel<T>(bound : usize) -> (Sender<T>, Receiver<T>) {
113 let (sender, receiver) = std::sync::mpsc::sync_channel(bound);
114 (Sender::new_sync(sender), Receiver::new(receiver))
115}
116
117pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
118 let (sender, receiver) = std::sync::mpsc::channel();
119 (Sender::new(sender), Receiver::new(receiver))
120}
121
122
123impl<T> From<std::sync::mpsc::TrySendError<T>> for TrySendError<T> {
124 fn from(value: std::sync::mpsc::TrySendError<T>) -> Self {
125 match value {
126 std::sync::mpsc::TrySendError::Full(v) => TrySendError::Full(v),
127 std::sync::mpsc::TrySendError::Disconnected(v) => TrySendError::Disconnected(v),
128 }
129 }
130}
131impl<T> From<std::sync::mpsc::SendError<T>> for TrySendError<T> {
132 fn from(value: std::sync::mpsc::SendError<T>) -> Self {
133 TrySendError::Disconnected(value.0)
134 }
135}
136
137impl<T> From<std::sync::mpsc::SendError<T>> for SendError<T> {
138 fn from(value: std::sync::mpsc::SendError<T>) -> Self {
139 SendError(value.0)
140 }
141}
142
143impl From<std::sync::mpsc::RecvError> for RecvError {
144 fn from(_value: std::sync::mpsc::RecvError) -> Self {
145 RecvError
146 }
147}
148
149impl From<std::sync::mpsc::TryRecvError> for TryRecvError {
150 fn from(value: std::sync::mpsc::TryRecvError) -> Self {
151 match value {
152 std::sync::mpsc::TryRecvError::Disconnected => TryRecvError::Disconnected,
153 std::sync::mpsc::TryRecvError::Empty => TryRecvError::Empty
154 }
155 }
156}
157impl From<std::sync::mpsc::RecvTimeoutError> for RecvTimeoutError {
158 fn from(value: std::sync::mpsc::RecvTimeoutError) -> Self {
159 match value {
160 std::sync::mpsc::RecvTimeoutError::Disconnected => RecvTimeoutError::Disconnected,
161 std::sync::mpsc::RecvTimeoutError::Timeout => RecvTimeoutError::Timeout
162 }
163 }
164}