use async_channel::Sender;
use async_channel::SendError;
use async_channel::TrySendError;
use async_channel::RecvError;
use async_channel::Receiver;
use async_channel::TryRecvError;
pub trait SenderSync<T>
{
fn send_sync(&self, msg: T) -> Result<(), SendError<T>>;
}
pub trait ReceiverSync<T>
{
fn recv_sync(&self) -> Result<T, RecvError>;
}
impl <T> SenderSync<T> for Sender<T>
{
fn send_sync(&self, mut msg: T) -> Result<(), SendError<T>>
{
loop
{
match self.try_send(msg)
{
Ok(()) => return Ok(()),
Err(e) =>
{
match e
{
TrySendError::<T>::Closed(v) => return Err(SendError::<T>(v)),
TrySendError::<T>::Full(v) => msg = v
};
}
};
}
}
}
impl <T> ReceiverSync<T> for Receiver<T>
{
fn recv_sync(&self) -> Result<T, RecvError>
{
loop
{
match self.try_recv()
{
Ok(v) => return Ok(v),
Err(e) =>
{
match e
{
TryRecvError::Closed => return Err(RecvError {}),
_ => ()
};
}
};
}
}
}