mod types;
use crate::{
Job,
task::{Queue, QueueHandle},
};
pub use types::{QueueGroup, QueueGroupHandle};
impl QueueGroupHandle {
pub async fn shutdown(self) {
let handles = self.handles;
futures_util::future::join_all(handles.into_iter().map(|h| h.shutdown())).await;
}
}
mod sealed {
pub trait Sealed {}
}
pub trait RunnableQueue: sealed::Sealed {
fn run(self: Box<Self>) -> QueueHandle;
}
impl<I, E, F, Fut, DE, DF, DFut> sealed::Sealed for Queue<I, E, F, Fut, DE, DF, DFut>
where
I: Job + Send + Sync + 'static,
F: Fn(I) -> Fut + 'static + Send + Sync,
E: std::fmt::Display + Send + 'static,
Fut: Future<Output = Result<(), E>> + Send,
DF: Fn(I, usize) -> DFut + 'static + Send + Sync,
DE: std::fmt::Display + Send + 'static,
DFut: Future<Output = Result<(), DE>> + Send,
{
}
impl<I, E, F, Fut, DE, DF, DFut> RunnableQueue for Queue<I, E, F, Fut, DE, DF, DFut>
where
I: Job + Send + Sync + 'static,
F: Fn(I) -> Fut + 'static + Send + Sync,
E: std::fmt::Display + Send + 'static,
Fut: Future<Output = Result<(), E>> + Send,
DF: Fn(I, usize) -> DFut + 'static + Send + Sync,
DE: std::fmt::Display + Send + 'static,
DFut: Future<Output = Result<(), DE>> + Send,
{
fn run(self: Box<Self>) -> QueueHandle {
Queue::run(*self)
}
}
impl QueueGroup {
pub fn push(&mut self, queue: impl RunnableQueue + 'static) {
self.queues.push(Box::new(queue));
}
pub fn run_all(self) -> QueueGroupHandle {
QueueGroupHandle {
handles: self.queues.into_iter().map(RunnableQueue::run).collect(),
}
}
}