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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use core::result::Result;
use core::time::Duration;
use crate::errors::Errors;
pub trait Spin: Errors {
fn spin(&mut self, duration: Option<Duration>) -> Result<(), Self::Error>;
}
pub trait Postbox<P>: Errors {
fn post(&mut self, payload: &P, wait: Option<Duration>) -> Result<bool, Self::Error>;
}
impl<'a, P, PB> Postbox<P> for &'a mut PB
where
PB: Postbox<P> + Errors,
{
fn post(&mut self, payload: &P, wait: Option<Duration>) -> Result<bool, Self::Error> {
(*self).post(payload, wait)
}
}
pub trait EventBus<P>: Errors {
type Subscription;
fn subscribe(
&mut self,
callback: impl for<'a> FnMut(&'a P) + Send + 'static,
) -> Result<Self::Subscription, Self::Error>;
}
impl<'a, P, E> EventBus<P> for &'a mut E
where
E: EventBus<P>,
{
type Subscription = E::Subscription;
fn subscribe(
&mut self,
callback: impl for<'b> FnMut(&'b P) + Send + 'static,
) -> Result<Self::Subscription, Self::Error> {
(*self).subscribe(callback)
}
}
pub trait PostboxProvider<P>: Errors {
type Postbox: Postbox<P, Error = Self::Error>;
fn postbox(&mut self) -> Result<Self::Postbox, Self::Error>;
}
impl<'a, P, PP> PostboxProvider<P> for &'a mut PP
where
PP: PostboxProvider<P>,
{
type Postbox = PP::Postbox;
fn postbox(&mut self) -> Result<Self::Postbox, Self::Error> {
(*self).postbox()
}
}
pub trait PinnedEventBus<P>: Errors {
type Subscription;
fn subscribe(
&mut self,
callback: impl for<'a> FnMut(&'a P) + 'static,
) -> Result<Self::Subscription, Self::Error>;
}
impl<'a, P, E> PinnedEventBus<P> for &'a mut E
where
E: PinnedEventBus<P>,
{
type Subscription = E::Subscription;
fn subscribe(
&mut self,
callback: impl for<'b> FnMut(&'b P) + 'static,
) -> Result<Self::Subscription, Self::Error> {
(*self).subscribe(callback)
}
}
#[cfg(feature = "experimental")]
pub mod nonblocking {
use crate::channel::nonblocking::{Receiver, Sender};
use crate::errors::Errors;
pub use super::Spin;
pub trait EventBus<P>: Errors {
type Subscription: Receiver<Data = P, Error = Self::Error>;
fn subscribe(&mut self) -> Result<Self::Subscription, Self::Error>;
}
pub trait PostboxProvider<P>: Errors {
type Postbox: Sender<Data = P, Error = Self::Error>;
fn postbox(&mut self) -> Result<Self::Postbox, Self::Error>;
}
}