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()
}
pub(crate) fn invoke_subscribers_by_id<T>(subs: &SubscriberList<T>, val: &T, ids: &[u64]) -> usize
where
T: 'static,
{
let guard = match subs.lock() {
Ok(g) => g,
Err(poisoned) => {
tracing::warn!("[invoke_subscribers_by_id] subscriber lock poisoned, recovering");
poisoned.into_inner()
}
};
let mut count = 0;
for id in ids {
if let Some(cb) = guard.get(*id as usize) {
cb(val);
count += 1;
}
}
count
}