use core::task::Waker;
#[derive(Debug)]
pub(crate) struct WakerRegistration {
waker: Option<Waker>,
}
impl WakerRegistration {
pub(crate) const fn new() -> Self {
Self { waker: None }
}
pub(crate) fn register(&mut self, w: &Waker) {
match self.waker {
Some(ref w2) if (w2.will_wake(w)) => {}
_ => {
if let Some(old_waker) = std::mem::replace(&mut self.waker, Some(w.clone())) {
old_waker.wake()
}
}
}
}
pub(crate) fn wake(&mut self) {
if let Some(w) = self.waker.take() {
w.wake()
}
}
}