hermes_async_runtime_components/channel/
traits.rs

1use alloc::sync::Arc;
2
3use cgp::prelude::*;
4use futures_channel::mpsc;
5use futures_util::lock::Mutex;
6use hermes_runtime_components::traits::channel::{
7    ChannelTypeComponent, HasChannelTypes, ProvideChannelType,
8};
9
10pub trait HasUnboundedChannelType: HasChannelTypes {
11    fn from_unbounded_sender<T>(sender: Arc<Mutex<mpsc::UnboundedSender<T>>>) -> Self::Sender<T>
12    where
13        T: Async;
14
15    fn from_unbounded_receiver<T>(receiver: mpsc::UnboundedReceiver<T>) -> Self::Receiver<T>
16    where
17        T: Async;
18
19    fn to_unbounded_receiver<T>(receiver: Self::Receiver<T>) -> mpsc::UnboundedReceiver<T>
20    where
21        T: Async;
22
23    fn to_unbounded_sender_ref<T>(
24        sender: &Self::Sender<T>,
25    ) -> &Arc<Mutex<mpsc::UnboundedSender<T>>>
26    where
27        T: Async;
28
29    fn to_unbounded_receiver_ref<T>(
30        receiver: &mut Self::Receiver<T>,
31    ) -> &mut mpsc::UnboundedReceiver<T>
32    where
33        T: Async;
34}
35
36pub trait UnboundedChannelTypeProvider<Runtime>: ProvideChannelType<Runtime>
37where
38    Runtime: Async,
39{
40    fn from_unbounded_sender<T>(sender: Arc<Mutex<mpsc::UnboundedSender<T>>>) -> Self::Sender<T>
41    where
42        T: Async;
43
44    fn from_unbounded_receiver<T>(receiver: mpsc::UnboundedReceiver<T>) -> Self::Receiver<T>
45    where
46        T: Async;
47
48    fn to_unbounded_receiver<T>(receiver: Self::Receiver<T>) -> mpsc::UnboundedReceiver<T>
49    where
50        T: Async;
51
52    fn to_unbounded_sender_ref<T>(
53        sender: &Self::Sender<T>,
54    ) -> &Arc<Mutex<mpsc::UnboundedSender<T>>>
55    where
56        T: Async;
57
58    fn to_unbounded_receiver_ref<T>(
59        receiver: &mut Self::Receiver<T>,
60    ) -> &mut mpsc::UnboundedReceiver<T>
61    where
62        T: Async;
63}
64
65impl<Runtime, Components> HasUnboundedChannelType for Runtime
66where
67    Runtime: Async + HasComponents<Components = Components>,
68    Components: UnboundedChannelTypeProvider<Runtime> + ProvideChannelType<Runtime>,
69{
70    fn from_unbounded_sender<T>(sender: Arc<Mutex<mpsc::UnboundedSender<T>>>) -> Self::Sender<T>
71    where
72        T: Async,
73    {
74        Components::from_unbounded_sender(sender)
75    }
76
77    fn from_unbounded_receiver<T>(receiver: mpsc::UnboundedReceiver<T>) -> Self::Receiver<T>
78    where
79        T: Async,
80    {
81        Components::from_unbounded_receiver(receiver)
82    }
83
84    fn to_unbounded_receiver<T>(receiver: Self::Receiver<T>) -> mpsc::UnboundedReceiver<T>
85    where
86        T: Async,
87    {
88        Components::to_unbounded_receiver(receiver)
89    }
90
91    fn to_unbounded_sender_ref<T>(sender: &Self::Sender<T>) -> &Arc<Mutex<mpsc::UnboundedSender<T>>>
92    where
93        T: Async,
94    {
95        Components::to_unbounded_sender_ref(sender)
96    }
97
98    fn to_unbounded_receiver_ref<T>(
99        receiver: &mut Self::Receiver<T>,
100    ) -> &mut mpsc::UnboundedReceiver<T>
101    where
102        T: Async,
103    {
104        Components::to_unbounded_receiver_ref(receiver)
105    }
106}
107
108impl<Runtime, Component, Delegate> UnboundedChannelTypeProvider<Runtime> for Component
109where
110    Runtime: Async,
111    Component: DelegateComponent<ChannelTypeComponent, Delegate = Delegate>,
112    Delegate: UnboundedChannelTypeProvider<Runtime>,
113{
114    fn from_unbounded_sender<T>(sender: Arc<Mutex<mpsc::UnboundedSender<T>>>) -> Self::Sender<T>
115    where
116        T: Async,
117    {
118        Delegate::from_unbounded_sender(sender)
119    }
120
121    fn from_unbounded_receiver<T>(receiver: mpsc::UnboundedReceiver<T>) -> Self::Receiver<T>
122    where
123        T: Async,
124    {
125        Delegate::from_unbounded_receiver(receiver)
126    }
127
128    fn to_unbounded_receiver<T>(receiver: Self::Receiver<T>) -> mpsc::UnboundedReceiver<T>
129    where
130        T: Async,
131    {
132        Delegate::to_unbounded_receiver(receiver)
133    }
134
135    fn to_unbounded_sender_ref<T>(sender: &Self::Sender<T>) -> &Arc<Mutex<mpsc::UnboundedSender<T>>>
136    where
137        T: Async,
138    {
139        Delegate::to_unbounded_sender_ref(sender)
140    }
141
142    fn to_unbounded_receiver_ref<T>(
143        receiver: &mut Self::Receiver<T>,
144    ) -> &mut mpsc::UnboundedReceiver<T>
145    where
146        T: Async,
147    {
148        Delegate::to_unbounded_receiver_ref(receiver)
149    }
150}