use crate::compati::Mutex;
use crate::valtron::streams::StreamIterator;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WakeResult {
Successful,
NotSupported,
}
#[cfg(feature = "multi")]
pub type WakeCallback = Box<dyn Fn() + Send + 'static>;
#[cfg(not(feature = "multi"))]
pub type WakeCallback = Box<dyn Fn() + 'static>;
pub trait WakeableStream: StreamIterator {
fn wake(&mut self, cb: WakeCallback) -> WakeResult {
let _ = cb; WakeResult::NotSupported
}
}
pub struct WakeRegistry {
callbacks: Mutex<Vec<WakeCallback>>,
}
impl WakeRegistry {
pub fn new() -> Self {
Self {
callbacks: Mutex::new(Vec::new()),
}
}
pub fn register(&self, cb: WakeCallback) {
self.callbacks.lock().unwrap().push(cb);
}
pub fn fire(&self) {
let callbacks = std::mem::take(&mut *self.callbacks.lock().unwrap());
for cb in callbacks {
cb();
}
}
}
impl Default for WakeRegistry {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Debug for WakeRegistry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WakeRegistry")
.field("pending", &self.callbacks.lock().unwrap().len())
.finish()
}
}