use std::{cell::Cell, fmt, marker::PhantomData, rc, task::Waker};
#[derive(Default)]
pub struct LocalWaker {
waker: Cell<Option<Waker>>,
_t: PhantomData<rc::Rc<()>>,
}
impl LocalWaker {
pub fn new() -> Self {
LocalWaker {
waker: Cell::new(None),
_t: PhantomData,
}
}
#[inline]
pub fn register(&self, waker: &Waker) -> bool {
self.waker.replace(Some(waker.clone())).is_some()
}
#[inline]
pub fn wake(&self) {
if let Some(waker) = self.take() {
waker.wake();
}
}
pub fn take(&self) -> Option<Waker> {
self.waker.take()
}
}
impl fmt::Debug for LocalWaker {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "LocalWaker")
}
}