#![deny(missing_docs)]
macro_rules! implement {
(
$doc:literal,
$sender:ty,
$receiver:ty,
($($new_args:ident: $new_args_ty:ty),*),
$make_chan:expr,
) => {
#[doc = $doc]
pub struct LazyQueue<Item> {
sender: $sender,
}
impl<Item> Clone for LazyQueue<Item> {
fn clone(&self) -> Self {
LazyQueue {
sender: self.sender.clone(),
}
}
}
#[must_use = "futures do nothing unless polled"]
pub struct QueueProcessor<Item, P, I>
where
I: ::std::future::Future,
{
inner: crate::inner::StreamProcessor<$receiver, P, I>,
}
impl<Item> LazyQueue<Item> {
pub fn new<F, I>(processor: F, $($new_args: $new_args_ty),*) -> (Self, QueueProcessor<Item, F, I>)
where
F: FnMut(Item) -> I,
I: ::std::future::Future,
{
let (sender, receiver) = $make_chan;
(
LazyQueue { sender },
QueueProcessor {
inner: StreamProcessor::new(receiver, processor),
},
)
}
}
impl<Item, P, I> ::std::future::Future for QueueProcessor<Item, P, I>
where
P: FnMut(Item) -> I,
I: ::std::future::Future,
{
type Output = ();
fn poll(self: ::std::pin::Pin<&mut Self>, ctx: &mut std::task::Context<'_>)
-> ::std::task::Poll<Self::Output> {
let inner = unsafe { self.map_unchecked_mut(|this| &mut this.inner) };
inner.poll(ctx)
}
}
};
}
mod inner;
mod sync;
pub use crate::sync::{bounded, unbounded};