use std::cell::RefCell;
use std::rc::Rc;
use super::runtime::{NodeData, NodeId, ReactiveNode, Scope};
use super::scheduler;
use super::with_runtime;
pub fn effect(f: impl FnMut() + 'static) -> NodeId {
let compute: Rc<RefCell<dyn FnMut()>> = Rc::new(RefCell::new(f));
let needs_warning = with_runtime(|rt| rt.current_owner().is_none());
if needs_warning {
super::warn_no_owner("effect()");
}
let node_id = with_runtime(|rt| {
let owner = rt.current_owner().unwrap_or_else(|| {
let detached = rt.owners.insert(Scope::new(None));
rt.owner_stack.push(detached);
detached
});
let id = rt.nodes.insert(ReactiveNode {
owner,
data: NodeData::Effect {
compute: compute.clone(),
},
sources: Default::default(),
subscribers: Default::default(),
arc_sources: Vec::new(),
});
if let Some(o) = rt.owners.get_mut(owner) {
o.nodes.push(id);
}
id
});
scheduler::schedule(node_id);
scheduler::flush();
node_id
}