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 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