use crate::Renderer;
use std::sync::Arc;
pub(crate) type SubscriberList<T> = Arc<std::sync::Mutex<Vec<Box<dyn Fn(&T) + Send + Sync>>>>;
pub trait FrameRenderer<E = ()>: Renderer {
fn begin_frame(&mut self) -> E;
fn render_frame(&mut self) {
}
fn end_frame(&mut self, encoder: E);
}
pub(crate) fn invoke_subscribers_safely<T>(subs: &SubscriberList<T>, val: &T) -> usize
where
T: 'static,
{
let guard = match subs.lock() {
Ok(g) => g,
Err(poisoned) => {
tracing::warn!("[invoke_subscribers_safely] subscriber lock poisoned, recovering");
poisoned.into_inner()
}
};
for cb in guard.iter() {
cb(val);
}
guard.len()
}