use wasm_safe_thread::mpsc as wasm_mpsc;
pub use wasm_safe_thread::mpsc::{RecvError, RecvTimeoutError, SendError, TryRecvError};
use web_time::Instant;
#[must_use]
pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
let (tx, rx) = wasm_mpsc::channel();
(Sender(tx), Receiver(rx))
}
pub struct Sender<T>(wasm_safe_thread::mpsc::Sender<T>);
impl<T> Sender<T> {
pub fn send(&self, value: T) -> Result<(), SendError<T>> {
self.0.send_sync(value)
}
}
impl<T> Clone for Sender<T> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
pub struct Receiver<T>(wasm_safe_thread::mpsc::Receiver<T>);
impl<T> Receiver<T> {
pub fn iter(&self) -> impl Iterator<Item = T> + '_ {
std::iter::from_fn(move || self.recv().ok())
}
pub fn recv(&self) -> Result<T, RecvError> {
self.0.recv_sync()
}
pub async fn recv_async(&self) -> Result<T, RecvError> {
self.0.recv_async().await
}
pub fn recv_timeout(&self, deadline: Instant) -> Result<T, RecvTimeoutError> {
self.0.recv_sync_timeout(deadline)
}
pub fn try_iter(&self) -> impl Iterator<Item = T> + '_ {
std::iter::from_fn(move || self.try_recv().ok())
}
pub fn try_recv(&self) -> Result<T, TryRecvError> {
self.0.try_recv()
}
}