hermes_async_runtime_components/channel/
traits.rs1use 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}