use std::task::{Context, Poll};
pub struct Receiver<T> {
inner: flume::Receiver<T>,
}
impl<T> std::fmt::Debug for Receiver<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Receiver").finish_non_exhaustive()
}
}
pub struct Sender<T> {
inner: flume::Sender<T>,
}
impl<T> std::fmt::Debug for Sender<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Sender").finish_non_exhaustive()
}
}
pub use flume::{RecvError, RecvTimeoutError, SendError, TryRecvError, TrySendError};
impl<T> Receiver<T> {
pub fn recv(&self) -> Result<T, RecvError> {
self.inner.recv()
}
pub fn try_recv(&self) -> Result<T, TryRecvError> {
self.inner.try_recv()
}
pub fn recv_timeout(&self, timeout: std::time::Duration) -> Result<T, RecvTimeoutError> {
self.inner.recv_timeout(timeout)
}
pub fn poll_recv(&mut self, _cx: &mut Context<'_>) -> Poll<Option<T>> {
match self.inner.try_recv() {
Ok(value) => Poll::Ready(Some(value)),
Err(TryRecvError::Empty) => Poll::Pending,
Err(TryRecvError::Disconnected) => Poll::Ready(None),
}
}
pub async fn recv_async(&self) -> Result<T, RecvError> {
self.inner.recv_async().await
}
}
impl<T> Clone for Receiver<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<T> Sender<T> {
pub fn send(&self, value: T) -> Result<(), SendError<T>> {
self.inner.send(value)
}
pub async fn send_async(&self, value: T) -> Result<(), SendError<T>> {
self.inner.send_async(value).await
}
pub fn try_send(&self, value: T) -> Result<(), TrySendError<T>> {
self.inner.try_send(value)
}
}
impl<T> Clone for Sender<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
#[must_use]
pub fn unbounded<T>() -> (Sender<T>, Receiver<T>) {
let (tx, rx) = flume::unbounded();
(Sender { inner: tx }, Receiver { inner: rx })
}
#[must_use]
pub fn bounded<T>(capacity: usize) -> (Sender<T>, Receiver<T>) {
let (tx, rx) = flume::bounded(capacity);
(Sender { inner: tx }, Receiver { inner: rx })
}