deferred_future/
local_deferred_future.rs

1use ::futures::future::FusedFuture;
2use ::std::{cell::{Cell, RefCell}, future::Future, pin::Pin, rc::Rc, task::{Context, Poll, Waker}};
3#[derive(Default)]
4pub struct LocalSharedState<T> {
5    data: Option<T>,
6    waker: Option<Waker>,
7}
8impl<T> LocalSharedState<T> {
9    #[allow(unused)]
10    pub fn complete(&mut self, data: T) {
11        self.data.replace(data);
12        self.waker.take().map(|waker| {waker.wake()});
13    }
14}
15pub struct LocalDeferredFuture<T> {
16    is_terminated: Cell<bool>,
17    shared_state: Rc<RefCell<LocalSharedState<T>>>
18}
19impl<T> LocalDeferredFuture<T> {
20    pub fn defer(&self) -> Rc<RefCell<LocalSharedState<T>>> {
21        Rc::clone(&self.shared_state)
22    }
23}
24impl<T> Default for LocalDeferredFuture<T> {
25    fn default() -> Self {
26        Self {
27            is_terminated: Cell::new(false),
28            shared_state: Rc::new(RefCell::new(LocalSharedState {
29                data: None,
30                waker: None
31            }))
32        }
33    }
34}
35impl<T> Future for LocalDeferredFuture<T> {
36    type Output = T;
37    fn poll(self: Pin<&mut Self>, context: &mut Context<'_>) -> Poll<Self::Output> {
38        let current_waker = context.waker();
39        let mut shared_state = self.shared_state.borrow_mut();
40        if shared_state.waker.as_ref().map_or(true, |w| !w.will_wake(current_waker)) {
41            shared_state.waker.replace(current_waker.clone());
42        }
43        if shared_state.data.is_none() {
44            self.is_terminated.set(false);
45            Poll::Pending
46        } else {
47            self.is_terminated.set(true);
48            Poll::Ready(shared_state.data.take().unwrap())
49        }
50    }
51}
52impl<T> FusedFuture for LocalDeferredFuture<T> {
53    fn is_terminated(&self) -> bool {
54        self.is_terminated.get()
55    }
56}