use qubit_executor::{
TaskCompletion,
TaskRunner,
};
use qubit_function::Callable;
pub struct PoolJob {
run: Box<dyn FnOnce() + Send + 'static>,
cancel: Box<dyn FnOnce() + Send + 'static>,
}
impl PoolJob {
pub fn new(
run: Box<dyn FnOnce() + Send + 'static>,
cancel: Box<dyn FnOnce() + Send + 'static>,
) -> Self {
Self { run, cancel }
}
pub fn from_task<C, R, E>(task: C, completion: TaskCompletion<R, E>) -> Self
where
C: Callable<R, E> + Send + 'static,
R: Send + 'static,
E: Send + 'static,
{
let cancel_completion = completion.clone();
Self::new(
Box::new(move || {
TaskRunner::new(task).run(completion);
}),
Box::new(move || {
cancel_completion.cancel();
}),
)
}
pub(crate) fn run(self) {
(self.run)();
}
pub(crate) fn cancel(self) {
(self.cancel)();
}
}