local_async_utils 0.2.13

Utilities for single-threaded async programming
Documentation
use std::cell::UnsafeCell;
use std::task::{Context, Waker};

#[derive(Default)]
pub(super) struct WakerCell(UnsafeCell<Option<Waker>>);

impl WakerCell {
    pub(super) fn update(&self, cx: &mut Context) {
        let waker = unsafe { &mut *self.0.get() };
        if waker.as_ref().is_none_or(|w| !w.will_wake(cx.waker())) {
            waker.replace(cx.waker().clone());
        }
    }

    pub(super) fn take_and_wake(&self) {
        let waker = unsafe { &mut *self.0.get() };
        waker.take().inspect(Waker::wake_by_ref);
    }

    pub(super) fn reset(&self) {
        let waker = unsafe { &mut *self.0.get() };
        *waker = None;
    }
}