use { crate::IoUringData, jay_utils::numcell::NumCell, std::{cell::Cell, future::poll_fn, rc::Rc, task::Poll}, }; pub struct Debouncer { pub(super) cur: NumCell, pub(super) max: u64, pub(super) iteration: Cell, pub(super) ring: Rc, } impl Debouncer { pub async fn debounce(&self) { let iteration = self.ring.iteration.get(); if self.iteration.replace(iteration) != iteration { self.cur.set(0); } if self.cur.fetch_add(1) > self.max { poll_fn(|ctx| { if self.ring.iteration.get() > iteration { Poll::Ready(()) } else { self.ring.yields.push(ctx.waker().clone()); Poll::Pending } }) .await; self.cur.set(0); } } }