use std::cell::RefCell;
use std::rc::Rc;
use crate::request_frame;
type TickFn = Rc<RefCell<dyn FnMut() -> bool>>;
thread_local! {
static REGISTRY: RefCell<Vec<(String, TickFn)>> = RefCell::new(Vec::new());
}
pub fn register(key: String, tick: TickFn) {
REGISTRY.with(|reg| {
let mut list = reg.borrow_mut();
list.retain(|(k, _)| k != &key);
list.push((key, tick));
});
}
pub fn unregister(key: &str) {
REGISTRY.with(|reg| {
reg.borrow_mut().retain(|(k, _)| k != key);
});
}
pub fn tick() -> bool {
let mut any_still = false;
REGISTRY.with(|reg| {
let mut list = reg.borrow_mut();
for (_key, tick_fn) in list.iter_mut() {
if tick_fn.borrow_mut()() {
any_still = true;
}
}
});
if any_still {
request_frame();
}
any_still
}
pub fn is_active() -> bool {
REGISTRY.with(|reg| !reg.borrow().is_empty())
}