use std::sync::Arc;
use crossbeam_queue::SegQueue;
use qubit_function::{
Callable,
Runnable,
};
pub(crate) struct CallableTask<C, R> {
callable: Option<C>,
index: usize,
outputs: Arc<SegQueue<(usize, R)>>,
}
impl<C, R> CallableTask<C, R> {
#[inline]
pub(crate) fn new(callable: C, index: usize, outputs: Arc<SegQueue<(usize, R)>>) -> Self {
Self {
callable: Some(callable),
index,
outputs,
}
}
}
impl<C, R, E> Runnable<E> for CallableTask<C, R>
where
C: Callable<R, E>,
{
fn run(&mut self) -> Result<(), E> {
let mut callable = self
.callable
.take()
.expect("callable task may only run once");
let value = callable.call()?;
self.outputs.push((self.index, value));
Ok(())
}
}