Skip to main content

active_dom/reactivity/
runtime.rs

1use 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/// Runtime
13/// 
14/// 
15#[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    /// Run Effect
26    /// 
27    /// 
28    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            // set running effect to current effect
34            *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}