use crate::cancel::CancelToken;
use crate::job::Job;
use crate::outcome::Outcome;
pub trait Executor: Send + Sync {
fn execute<C, F>(
&self,
jobs: Vec<Job<C>>,
run: F,
cancel: &CancelToken,
) -> Vec<(Job<C>, Outcome<C>)>
where
C: Send + 'static,
F: Fn(&Job<C>) -> Outcome<C> + Send + Sync;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct SerialExecutor;
impl Executor for SerialExecutor {
fn execute<C, F>(
&self,
jobs: Vec<Job<C>>,
run: F,
cancel: &CancelToken,
) -> Vec<(Job<C>, Outcome<C>)>
where
C: Send + 'static,
F: Fn(&Job<C>) -> Outcome<C> + Send + Sync,
{
let mut executed = Vec::with_capacity(jobs.len());
for job in jobs {
if cancel.is_cancelled() {
break;
}
let outcome = run(&job);
executed.push((job, outcome));
}
executed
}
}