use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
pub struct EventStream {
id: u64,
unsubscribe: Arc<dyn Fn(u64) + Send + Sync + 'static>,
unsubscribed: AtomicBool,
}
impl EventStream {
#[doc(hidden)]
pub fn new(id: u64, unsubscribe: Arc<dyn Fn(u64) + Send + Sync + 'static>) -> Self {
Self {
id,
unsubscribe,
unsubscribed: AtomicBool::new(false),
}
}
pub fn id(&self) -> u64 {
self.id
}
pub fn unsubscribe(&self) {
if !self.unsubscribed.swap(true, Ordering::SeqCst) {
(self.unsubscribe)(self.id);
}
}
}
impl Drop for EventStream {
fn drop(&mut self) {
if !self.unsubscribed.swap(true, Ordering::SeqCst) {
(self.unsubscribe)(self.id);
}
}
}