1use core::fmt::Debug;
2use core::marker::PhantomData;
3
4pub mod mpmc;
5pub mod notification;
6pub mod pubsub;
7pub mod signal;
8#[cfg(any(feature = "edge-ws", feature = "embedded-svc", feature = "wasm"))]
9pub mod ws;
10
11pub trait Sender {
12 type Error: Debug;
13
14 type Data;
15
16 async fn send(&mut self, data: Self::Data) -> Result<(), Self::Error>;
17}
18
19impl<'t, T> Sender for &'t mut T
20where
21 T: Sender + 't,
22{
23 type Error = T::Error;
24
25 type Data = T::Data;
26
27 async fn send(&mut self, data: Self::Data) -> Result<(), Self::Error> {
28 (*self).send(data).await
29 }
30}
31
32impl<D, E: Debug> Sender for PhantomData<fn() -> (D, E)> {
33 type Error = E;
34
35 type Data = D;
36
37 async fn send(&mut self, _data: Self::Data) -> Result<(), Self::Error> {
38 Ok(())
39 }
40}
41
42pub fn nil_sender<D, E: Debug>() -> impl Sender<Error = E, Data = D> {
43 PhantomData
44}
45
46pub trait Receiver {
47 type Error: Debug;
48
49 type Data;
50
51 async fn recv(&mut self) -> Result<Self::Data, Self::Error>;
52}
53
54impl<'t, T> Receiver for &'t mut T
55where
56 T: Receiver + 't,
57{
58 type Error = T::Error;
59
60 type Data = T::Data;
61
62 async fn recv(&mut self) -> Result<Self::Data, Self::Error> {
63 (*self).recv().await
64 }
65}
66
67impl<D, E: Debug> Receiver for PhantomData<fn() -> (D, E)> {
68 type Error = E;
69
70 type Data = D;
71
72 async fn recv(&mut self) -> Result<Self::Data, Self::Error> {
73 core::future::pending().await
74 }
75}
76
77pub fn nil_receiver<D, E: Debug>() -> impl Receiver<Error = E, Data = D> {
78 PhantomData
79}
80
81pub struct Mapper<C, F, Q>(C, F, PhantomData<fn() -> Q>);
82
83impl<C, F, Q> Mapper<C, F, Q> {
84 pub const fn new(channel: C, mapper: F) -> Self {
85 Self(channel, mapper, PhantomData)
86 }
87}
88
89impl<C, F, Q> Sender for Mapper<C, F, Q>
90where
91 C: Sender,
92 F: Fn(Q) -> Option<C::Data>,
93{
94 type Error = C::Error;
95
96 type Data = Q;
97
98 async fn send(&mut self, data: Self::Data) -> Result<(), Self::Error> {
99 if let Some(data) = (self.1)(data) {
100 self.0.send(data).await
101 } else {
102 Ok(())
103 }
104 }
105}
106
107impl<C, F, Q> Receiver for Mapper<C, F, Q>
108where
109 C: Receiver,
110 F: Fn(C::Data) -> Option<Q>,
111{
112 type Error = C::Error;
113
114 type Data = Q;
115
116 async fn recv(&mut self) -> Result<Self::Data, Self::Error> {
117 loop {
118 if let Some(data) = (self.1)(self.0.recv().await?) {
119 return Ok(data);
120 }
121 }
122 }
123}