active_dom/reactivity/
runtime.rs1use std::any::Any;
2use std::cell::RefCell;
3use std::collections::{HashMap, HashSet};
4use std::rc::Rc;
5
6#[derive(Clone, Copy, PartialEq, Eq, Hash)]
7pub struct EffectId(pub usize);
8
9#[derive(Clone, Copy, PartialEq, Eq, Hash)]
10pub struct SignalId(pub usize);
11
12#[derive(Default)]
16pub struct Runtime {
17 pub signals: Rc<RefCell<Vec<Box<dyn Any>>>>,
18
19 pub effects: Rc<RefCell<Vec<Box<dyn Fn()>>>>,
20 pub running_effect: Rc<RefCell<Option<EffectId>>>,
21 pub subscribers: Rc<RefCell<HashMap<SignalId, HashSet<EffectId>>>>,
22}
23
24impl Runtime {
25 pub fn run_effect(&'static self, effect_id: EffectId) {
29 let previous_effect = {
30 let mut running_effect = self.running_effect.borrow_mut();
31 let previous_effect = running_effect.take();
32
33 *running_effect = Some(effect_id);
35
36 previous_effect
37 };
38
39 {
40 let effects = { self.effects.borrow() };
41 effects[effect_id.0]();
42 }
43
44 {
45 *self.running_effect.borrow_mut() = previous_effect;
46 }
47 }
48}