channel_bridge/
asynch.rs

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}