byor 1.0.0

Bring your own runtime!
Documentation
use crate::{channel::mpsc::*, runtime::Smol};
use smol::channel::{Receiver as SmolReceiver, Sender as SmolSender};

impl<T: 'static> Sender<T> for smol::channel::Sender<T> {
    type SendError = smol::channel::SendError<T>;

    fn is_closed(&self) -> bool {
        self.is_closed()
    }
}

impl<T: 'static> BoundedSender<T> for SmolSender<T> {
    type TrySendError = smol::channel::TrySendError<T>;

    fn send(&mut self, message: T) -> impl Future<Output = Result<(), Self::SendError>> {
        SmolSender::send(self, message)
    }

    fn try_send(&mut self, message: T) -> Result<(), Self::TrySendError> {
        SmolSender::try_send(self, message)
    }
}

impl<T: 'static> Receiver<T> for smol::channel::Receiver<T> {
    type TryRecvError = smol::channel::TryRecvError;

    fn close(&mut self) {
        SmolReceiver::close(self);
    }

    fn try_recv(&mut self) -> Result<Option<T>, Self::TryRecvError> {
        match SmolReceiver::try_recv(self) {
            Ok(message) => Ok(Some(message)),
            Err(Self::TryRecvError::Empty) => Ok(None),
            Err(Self::TryRecvError::Closed) => Err(Self::TryRecvError::Closed),
        }
    }
}

impl<T: 'static> UnboundedSender<T> for SmolSender<T> {
    fn send(&self, message: T) -> Result<(), Self::SendError> {
        self.force_send(message).map(|_| ())
    }
}

impl RuntimeMpsc for Smol {
    type BoundedSender<T: 'static> = smol::channel::Sender<T>;
    type BoundedReceiver<T: 'static> = smol::channel::Receiver<T>;

    fn bounded_channel<T: 'static>(
        buffer: usize,
    ) -> (Self::BoundedSender<T>, Self::BoundedReceiver<T>) {
        smol::channel::bounded(buffer)
    }

    type UnboundedSender<T: 'static> = smol::channel::Sender<T>;
    type UnboundedReceiver<T: 'static> = smol::channel::Receiver<T>;

    fn unbounded_channel<T: 'static>() -> (Self::UnboundedSender<T>, Self::UnboundedReceiver<T>) {
        smol::channel::unbounded()
    }
}