async_ach_waker/
entity.rs

1use ach_option::AchOption;
2use core::ops::Deref;
3use core::task::Waker;
4
5pub struct WakerEntity<T> {
6    waker: AchOption<Waker>,
7    val: T,
8}
9impl<T> WakerEntity<T> {
10    pub fn new(waker: Waker, val: T) -> WakerEntity<T> {
11        let waker = AchOption::new_with(waker);
12        WakerEntity { waker, val }
13    }
14    pub fn set_waker(&self, waker: Waker) {
15        self.waker.replace(waker);
16    }
17    /// return true if wake it success.
18    pub fn wake(&self) -> bool {
19        if let Some(waker) = self.waker.take() {
20            waker.wake();
21            true
22        } else {
23            false
24        }
25    }
26    pub fn is_waked(&self) -> bool {
27        self.waker.is_none()
28    }
29}
30impl<T> Deref for WakerEntity<T> {
31    type Target = T;
32    fn deref(&self) -> &Self::Target {
33        &self.val
34    }
35}