use crate::event::Event;
use dashmap::DashMap;
use once_cell::sync::Lazy;
use std::sync::atomic::{AtomicU64, Ordering};
#[derive(PartialEq)]
pub enum Status {
Active,
Paused,
}
pub(crate) struct Subscriber {
pub(crate) status: Status,
pub(crate) callback: Box<dyn Fn(Event) + Send + Sync + 'static>,
}
pub(crate) static NEXT_ID: AtomicU64 = AtomicU64::new(0);
pub(crate) static CALLBACKS: Lazy<DashMap<u64, Subscriber>> = Lazy::new(DashMap::new);
pub(crate) fn dispatch(event: Event) {
for guard in CALLBACKS.iter() {
if guard.status == Status::Active {
(guard.callback)(event);
}
}
}
pub(crate) fn remove_all() {
CALLBACKS.clear();
NEXT_ID.store(0, Ordering::SeqCst);
}