use crate::backend::job::Data;
use crate::sync::promise::MapPromise;
use crate::sync::promise::{IntoPromise, PollPromise, Promise, PromiseSet};
#[derive(Debug)]
pub struct BackendFunnel {
promises: PromiseSet<'static, Vec<Data>>,
}
impl BackendFunnel {
pub fn new() -> Self {
Self {
promises: PromiseSet::new(),
}
}
pub fn insert<P: IntoPromise<Output = Data> + 'static>(&mut self, p: P) {
self.promises.insert(p.into_promise().map(|d| vec![d]));
}
pub fn insert_iter<
I: IntoIterator<Item = Data> + 'static,
P: IntoPromise<Output = I> + 'static,
>(
&mut self,
p: P,
) {
self.promises
.insert(p.into_promise().map(|i: I| i.into_iter().collect()));
}
}
impl IntoPromise for BackendFunnel {
type Output = Vec<Data>;
type IntoPromise = BackendFunnelPromise;
fn into_promise(self) -> Self::IntoPromise {
BackendFunnelPromise { set: self.promises }
}
}
pub struct BackendFunnelPromise {
set: PromiseSet<'static, Vec<Data>>,
}
impl Promise for BackendFunnelPromise {
type Output = Vec<Data>;
fn poll(&mut self) -> PollPromise<Self::Output> {
match self.set.poll() {
PollPromise::Ready(ready) => PollPromise::Ready(ready.into_iter().flatten().collect()),
PollPromise::Pending => PollPromise::Pending,
}
}
}