use { crate::utils::{clonecell::CloneCell, syncqueue::SyncQueue}, std::{ fmt::{Debug, Formatter}, rc::Rc, }, }; pub struct OnChange { pub on_change: CloneCell>>, pub events: SyncQueue, } impl OnChange { pub fn clear(&self) { self.on_change.take(); self.events.take(); } pub fn send_event(&self, event: T) { self.events.push(event); if let Some(cb) = self.on_change.get() { cb(); } } } impl Default for OnChange { fn default() -> Self { Self { on_change: Default::default(), events: Default::default(), } } } impl Debug for OnChange { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self.on_change.get() { None => f.write_str("None"), Some(_) => f.write_str("Some"), } } }