fgr/
lib.rs

1mod macros;
2mod reactivity;
3
4pub use reactivity::{batch, Effect, Memo, Signal};
5
6#[cfg(test)]
7use std::cell::RefCell;
8
9#[cfg(test)]
10use std::rc::Rc;
11
12#[test]
13fn test_effect() {
14    let out = Rc::new(RefCell::new(Vec::new()));
15    let a = Signal::new(1);
16    let b = Signal::new(2);
17    let c = Memo::new(cloned!((a, b) => move || *a.read() + *b.read()));
18    let _effect = Effect::new(cloned!((out) => move || out.borrow_mut().push(*c.read())));
19    *a.write() = 3;
20    batch(|| {
21        *a.write() = 10;
22        *b.write() = 12;
23    });
24    assert_eq!(*out.borrow(), vec![3, 5, 22]);
25}
26
27#[test]
28fn test_calmed() {
29    let out = Rc::new(RefCell::new(Vec::new()));
30    let a: Signal<i32> = Signal::new(1);
31    let b = Memo::new_calmed_eq(cloned!((a) => move || *a.read()));
32    let _effect = Effect::new(cloned!((out) =>move || out.borrow_mut().push(*b.read())));
33    *a.write() = 2;
34    *a.write() = 2;
35    *a.write() = 3;
36    assert_eq!(*out.borrow(), vec![1, 2, 3]);
37}
38
39#[test]
40fn test_memo_mem() {
41    let out = Rc::new(RefCell::new(Vec::new()));
42    let a = Signal::new(1);
43    {
44        let _e = Effect::new(cloned!((a, out) => move || out.borrow_mut().push(*a.read())));
45        *a.write() = 2;
46    }
47    *a.write() = 3;
48    // here should only output 1 2
49    assert_eq!(*out.borrow(), vec![1, 2]);
50}
51
52#[test]
53fn test_write_sig_in_effect() {
54    let out = Rc::new(RefCell::new(Vec::new()));
55    let a = Signal::new(1);
56    let b = Signal::new(0);
57    let _e1 = Effect::new(cloned!((a,b) => move || *b.write() = *a.read() * 2));
58    let _e2 = Effect::new(cloned!((out,b) => move || out.borrow_mut().push(*b.read())));
59    batch(move || {
60        *a.write() = 2;
61        *b.write() = 3;
62    });
63    assert_eq!(*out.borrow(), vec![2, 3, 4]);
64}
65