#[cfg(feature = "crossbeam-channel")]
pub use crossbeam::*;
use crate::SendError;
pub trait Mpmc<T> {
type Receiver: Receiver<T>;
type Sender: Sender<T>;
fn unbounded() -> (Self::Sender, Self::Receiver);
}
pub trait Receiver<T>: Clone {
fn recv(&self) -> crate::Result<T>;
}
pub trait Sender<T>: Clone {
fn send(&self, msg: T) -> Result<(), SendError<T>>;
}
#[cfg(feature = "crossbeam-channel")]
mod crossbeam {
use crate::{RecvError, SendError, sync::Mpmc};
use crossbeam_channel::{self, TryRecvError, TrySendError};
#[derive(Debug)]
pub struct CrossbeamMpmc {
_nothing: (),
}
impl<T> Mpmc<T> for CrossbeamMpmc {
type Receiver = crossbeam_channel::Receiver<T>;
type Sender = crossbeam_channel::Sender<T>;
#[inline]
fn unbounded() -> (Self::Sender, Self::Receiver) {
crossbeam_channel::unbounded()
}
}
impl<T> crate::sync::Receiver<T> for crossbeam_channel::Receiver<T> {
#[inline]
fn recv(&self) -> crate::Result<T> {
Ok(self.try_recv().map_err(|err| match err {
TryRecvError::Empty => RecvError::Empty,
TryRecvError::Disconnected => RecvError::Disconnected,
})?)
}
}
impl<T> crate::sync::Sender<T> for crossbeam_channel::Sender<T> {
#[inline]
fn send(&self, msg: T) -> Result<(), SendError<T>> {
self.try_send(msg).map_err(|err| match err {
TrySendError::Full(elem) => SendError::Full(elem),
TrySendError::Disconnected(elem) => SendError::Disconnected(elem),
})
}
}
}