use crate::{Error, Result};
use flume::{Receiver, bounded};
pub fn oneshot<T>() -> (OneShotTx<T>, OneShotRx<T>) {
let (tx, rx) = bounded(1);
(OneShotTx { sender: tx }, OneShotRx { receiver: rx })
}
#[derive(Debug, Clone)]
pub struct OneShotTx<T> {
sender: flume::Sender<T>,
}
impl<T> OneShotTx<T> {
pub fn send(&self, value: T) -> Result<()> {
self.sender
.send(value)
.map_err(|err| Error::custom(format!("Fail to OneShot send message. Cause: {err}")))?;
Ok(())
}
pub async fn send_async(&self, value: T) -> Result<()>
where
T: Send + 'static,
{
self.sender
.send_async(value)
.await
.map_err(|err| Error::custom(format!("Fail to OneShot send message. Cause: {err}")))?;
Ok(())
}
}
pub struct OneShotRx<T> {
receiver: Receiver<T>,
}
impl<T> OneShotRx<T> {
pub fn recv(self) -> Result<T> {
let v = self.receiver.recv()?;
Ok(v)
}
#[allow(unused)]
pub async fn recv_async(self) -> Result<T> {
let v = self.receiver.recv_async().await?;
Ok(v)
}
}