pub trait WorkerMethods<T, R> {
fn add_task(&self, task: T);
fn add_tasks(&self, tasks: impl IntoIterator<Item = T>);
fn get(&self) -> Option<R>;
fn get_blocking(&self) -> Option<R>;
fn cancel_tasks(&self);
fn get_iter(&self) -> impl Iterator<Item = R> {
std::iter::from_fn(|| self.get())
}
fn get_iter_blocking(&self) -> impl Iterator<Item = R> {
std::iter::from_fn(|| self.get_blocking())
}
fn get_vec(&self) -> Vec<R> {
self.get_iter().collect()
}
fn get_vec_blocking(&self) -> Vec<R> {
self.get_iter_blocking().collect()
}
fn get_buffered(&self, buffer: &mut [R]) -> usize {
write_buffered(buffer, self.get_iter())
}
fn get_buffered_blocking(&self, buffer: &mut [R]) -> usize {
write_buffered(buffer, self.get_iter_blocking())
}
fn pending_tasks(&self) -> usize;
fn reset(&self) {
self.cancel_tasks();
self.get_iter_blocking().for_each(|_| ());
}
}
fn write_buffered<R>(buffer: &mut [R], it: impl Iterator<Item = R>) -> usize {
let mut indx = 0;
for result in it.take(buffer.len()) {
buffer[indx] = result;
indx += 1;
}
indx
}