Skip to main content

kithara_platform/sync/
mpsc.rs

1#[cfg(not(target_arch = "wasm32"))]
2pub use std::sync::mpsc::{RecvError, SendError, TryRecvError};
3
4/// Create a new unbounded channel.
5#[cfg(not(target_arch = "wasm32"))]
6#[must_use]
7pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
8    let (tx, rx) = std::sync::mpsc::channel();
9    (Sender(tx), Receiver(rx))
10}
11
12#[cfg(not(target_arch = "wasm32"))]
13pub struct Sender<T>(std::sync::mpsc::Sender<T>);
14
15#[cfg(not(target_arch = "wasm32"))]
16impl<T> Sender<T> {
17    /// Send a value synchronously.
18    ///
19    /// # Errors
20    ///
21    /// Returns [`SendError`] if the receiver has been dropped.
22    pub fn send_sync(&self, value: T) -> Result<(), SendError<T>> {
23        self.0.send(value)
24    }
25}
26
27#[cfg(not(target_arch = "wasm32"))]
28impl<T> Clone for Sender<T> {
29    fn clone(&self) -> Self {
30        Self(self.0.clone())
31    }
32}
33
34#[cfg(not(target_arch = "wasm32"))]
35pub struct Receiver<T>(std::sync::mpsc::Receiver<T>);
36
37#[cfg(not(target_arch = "wasm32"))]
38impl<T> Receiver<T> {
39    /// Block until a value arrives.
40    ///
41    /// # Errors
42    ///
43    /// Returns [`RecvError`] if all senders have been dropped.
44    pub fn recv_sync(&self) -> Result<T, RecvError> {
45        self.0.recv()
46    }
47
48    /// Try to receive without blocking.
49    ///
50    /// # Errors
51    ///
52    /// Returns [`TryRecvError`] if no value is available or senders are dropped.
53    pub fn try_recv(&self) -> Result<T, TryRecvError> {
54        self.0.try_recv()
55    }
56}
57
58#[cfg(target_arch = "wasm32")]
59use wasm_safe_thread::mpsc as wasm_mpsc;
60#[cfg(target_arch = "wasm32")]
61pub use wasm_safe_thread::mpsc::{RecvError, SendError, TryRecvError};
62
63/// Create a new unbounded channel.
64#[cfg(target_arch = "wasm32")]
65#[must_use]
66pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
67    let (tx, rx) = wasm_mpsc::channel();
68    (Sender(tx), Receiver(rx))
69}
70
71#[cfg(target_arch = "wasm32")]
72pub struct Sender<T>(wasm_safe_thread::mpsc::Sender<T>);
73
74#[cfg(target_arch = "wasm32")]
75impl<T> Sender<T> {
76    /// Send a value synchronously.
77    ///
78    /// # Errors
79    ///
80    /// Returns [`SendError`] if the receiver has been dropped.
81    pub fn send_sync(&self, value: T) -> Result<(), SendError<T>> {
82        self.0.send_sync(value)
83    }
84}
85
86#[cfg(target_arch = "wasm32")]
87impl<T> Clone for Sender<T> {
88    fn clone(&self) -> Self {
89        Self(self.0.clone())
90    }
91}
92
93#[cfg(target_arch = "wasm32")]
94pub struct Receiver<T>(wasm_safe_thread::mpsc::Receiver<T>);
95
96#[cfg(target_arch = "wasm32")]
97impl<T> Receiver<T> {
98    /// Await a value asynchronously (WASM only).
99    ///
100    /// # Errors
101    ///
102    /// Returns [`RecvError`] if all senders have been dropped.
103    pub async fn recv_async(&self) -> Result<T, RecvError> {
104        self.0.recv_async().await
105    }
106
107    /// Block until a value arrives.
108    ///
109    /// # Errors
110    ///
111    /// Returns [`RecvError`] if all senders have been dropped.
112    pub fn recv_sync(&self) -> Result<T, RecvError> {
113        self.0.recv_sync()
114    }
115
116    /// Try to receive without blocking.
117    ///
118    /// # Errors
119    ///
120    /// Returns [`TryRecvError`] if no value is available or senders are dropped.
121    pub fn try_recv(&self) -> Result<T, TryRecvError> {
122        self.0.try_recv()
123    }
124}