use crate::{
RuntimeError,
futures::channel::{
core::Core,
ends::{BoundedSender, Receiver, Sender},
},
};
use std::marker::PhantomData;
pub struct Channel;
impl Channel {
#[allow(clippy::new_ret_no_self)]
pub fn new<T>() -> Unbounded<T>
where
T: Send + 'static,
{
Unbounded(PhantomData)
}
}
#[must_use = "a channel is only made by `open`"]
pub struct Unbounded<T>(PhantomData<fn() -> T>);
impl<T> Unbounded<T>
where
T: Send + 'static,
{
pub fn bounded(self, capacity: usize) -> Bounded<T> {
Bounded {
capacity: capacity.max(1),
_values: PhantomData,
}
}
pub fn open(self) -> Result<(Sender<T>, Receiver<T>), RuntimeError> {
let core = Core::open(None)?;
Ok((Sender::new(core.clone()), Receiver::new(core)))
}
}
#[must_use = "a channel is only made by `open`"]
pub struct Bounded<T> {
capacity: usize,
_values: PhantomData<fn() -> T>,
}
impl<T> Bounded<T>
where
T: Send + 'static,
{
pub fn open(self) -> Result<(BoundedSender<T>, Receiver<T>), RuntimeError> {
let core = Core::open(Some(self.capacity))?;
Ok((BoundedSender::new(core.clone()), Receiver::new(core)))
}
}