deferred_future/
local_deferred_future.rs1use ::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}