use serde::{Serialize, de::DeserializeOwned};
use super::mpsc;
use crate::{RemoteSend, codec};
mod receiver;
mod sender;
pub use receiver::{Receiver, RecvError, TryRecvError};
pub use sender::{SendError, Sender};
pub fn channel<T, Codec>() -> (Sender<T, Codec>, Receiver<T, Codec>)
where
T: Serialize + DeserializeOwned + Send + 'static,
Codec: codec::Codec,
{
let (tx, rx) = mpsc::channel(1);
let tx = tx.set_buffer();
let rx = rx.set_buffer();
(Sender(tx), Receiver(rx))
}
pub trait OneshotExt<T, Codec, const MAX_ITEM_SIZE: usize> {
fn with_max_item_size<const NEW_MAX_ITEM_SIZE: usize>(
self,
) -> (Sender<T, Codec>, Receiver<T, Codec, NEW_MAX_ITEM_SIZE>);
}
impl<T, Codec, const MAX_ITEM_SIZE: usize> OneshotExt<T, Codec, MAX_ITEM_SIZE>
for (Sender<T, Codec>, Receiver<T, Codec, MAX_ITEM_SIZE>)
where
T: RemoteSend,
Codec: codec::Codec,
{
fn with_max_item_size<const NEW_MAX_ITEM_SIZE: usize>(
self,
) -> (Sender<T, Codec>, Receiver<T, Codec, NEW_MAX_ITEM_SIZE>) {
let (mut tx, rx) = self;
tx.set_max_item_size(NEW_MAX_ITEM_SIZE);
let rx = rx.set_max_item_size();
(tx, rx)
}
}