use crate::*;
pub fn create_render_effect<F>(effect_fn: F) -> RenderEffect
where
F: FnMut() + 'static,
{
RenderEffect::create(effect_fn)
}
pub(crate) fn cleanup_effect_dependencies(effect_addr: usize, dependencies: &mut Vec<usize>) {
let registry: &mut HashMap<usize, Vec<usize>> = effect_subscribers_mut();
for signal_addr in dependencies.iter() {
if let Some(subscribers) = registry.get_mut(signal_addr) {
subscribers.retain(|addr| *addr != effect_addr);
if subscribers.is_empty() {
registry.remove(signal_addr);
}
}
}
dependencies.clear();
}
#[allow(static_mut_refs)]
fn ensure_effect_subscribers_mut() -> &'static mut HashMap<usize, Vec<usize>> {
unsafe {
if (*EFFECT_SUBSCRIBERS.get_0().get()).is_none() {
(*EFFECT_SUBSCRIBERS.get_0().get()) = Some(HashMap::new());
}
(*EFFECT_SUBSCRIBERS.get_0().get())
.as_mut()
.unwrap_unchecked()
}
}
#[allow(static_mut_refs)]
pub(crate) fn effect_subscribers_mut() -> &'static mut HashMap<usize, Vec<usize>> {
ensure_effect_subscribers_mut()
}
#[allow(static_mut_refs)]
pub(crate) fn set_current_effect(addr: Option<usize>) {
unsafe {
*CURRENT_EFFECT.get_0().get() = addr;
}
}
#[allow(static_mut_refs)]
pub(crate) fn swap_current_effect(new_addr: Option<usize>) -> Option<usize> {
unsafe {
let old: Option<usize> = *CURRENT_EFFECT.get_0().get();
*CURRENT_EFFECT.get_mut_0().get() = new_addr;
old
}
}
#[allow(static_mut_refs)]
pub(crate) fn render_effect_registry_mut()
-> &'static mut HashMap<usize, Rc<RefCell<RenderEffectInner>>> {
unsafe {
if (*RENDER_EFFECT_REGISTRY.get_0().get()).is_none() {
(*RENDER_EFFECT_REGISTRY.get_0().get()) = Some(HashMap::new());
}
(*RENDER_EFFECT_REGISTRY.get_0().get())
.as_mut()
.unwrap_unchecked()
}
}