use std::{any::Any, ops::Deref, sync::Arc};
pub type State = Option<Arc<dyn Any + Send + Sync>>;
pub type Callback = Box<dyn Fn(State) + Send + Sync>;
type CallbackRef = Arc<dyn Fn(State) + Send + Sync>;
pub struct Registration(#[allow(dead_code)] CallbackRef);
impl Registration {
#[inline]
pub fn new(callback: CallbackRef) -> Self {
Self(callback)
}
#[inline]
pub fn none() -> Self {
Self::default()
}
}
impl Default for Registration {
#[inline]
fn default() -> Self {
Self(Arc::new(|_| {}))
}
}
pub trait ChangeToken: Send + Sync {
fn changed(&self) -> bool;
fn must_poll(&self) -> bool {
false
}
#[must_use]
fn register(&self, callback: Callback, state: State) -> Registration;
}
impl ChangeToken for Box<dyn ChangeToken> {
#[inline]
fn changed(&self) -> bool {
self.deref().changed()
}
#[inline]
fn must_poll(&self) -> bool {
self.deref().must_poll()
}
#[inline]
fn register(&self, callback: Callback, state: State) -> Registration {
self.deref().register(callback, state)
}
}