use std::sync::Arc;
use qubit_atomic::Atomic;
use qubit_lock::Monitor;
use super::task_completion::TaskCompletion;
use super::task_handle::TaskHandle;
use super::task_handle_inner::TaskHandleInner;
use super::task_handle_state::TaskHandleState;
pub struct TaskCompletionPair<R, E> {
inner: Arc<TaskHandleInner<R, E>>,
}
impl<R, E> TaskCompletionPair<R, E> {
#[inline]
pub fn new() -> Self {
Self {
inner: Arc::new(TaskHandleInner {
state: Monitor::new(TaskHandleState {
result: None,
started: false,
completed: false,
waker: None,
}),
done: Atomic::new(false),
}),
}
}
#[inline]
pub fn into_parts(self) -> (TaskHandle<R, E>, TaskCompletion<R, E>) {
let handle = TaskHandle {
inner: Arc::clone(&self.inner),
};
let completion = TaskCompletion { inner: self.inner };
(handle, completion)
}
}
impl<R, E> Default for TaskCompletionPair<R, E> {
#[inline]
fn default() -> Self {
Self::new()
}
}