@@ -15,6 +15,65 @@ use crate::effect_stack::{effect_peak, effect_pop, effect_push};
1515/// - Like a callback: wraps a closure and runs it.
1616/// - Adds tracking: automatically re-runs when dependent signals change.
1717/// - Runs once immediately at creation.
18+ ///
19+ /// # Examples
20+ ///
21+ /// ## Basic usage
22+ /// ```
23+ /// use std::{cell::Cell, rc::Rc};
24+ /// use reactive_cache::Effect;
25+ ///
26+ /// let counter = Rc::new(Cell::new(0));
27+ /// let c_clone = counter.clone();
28+ ///
29+ /// let effect = Effect::new(move || {
30+ /// // This closure runs immediately
31+ /// c_clone.set(c_clone.get() + 1);
32+ /// });
33+ ///
34+ /// assert_eq!(counter.get(), 1);
35+ /// ```
36+ ///
37+ /// ## Using inside a struct
38+ /// ```
39+ /// use std::{rc::Rc, cell::Cell};
40+ /// use reactive_cache::{Signal, Memo, Effect};
41+ ///
42+ /// struct ViewModel {
43+ /// counter: Rc<Signal<i32>>,
44+ /// double: Rc<Memo<i32>>,
45+ /// effect: Rc<Effect>,
46+ /// run_count: Rc<Cell<u32>>,
47+ /// }
48+ ///
49+ /// let counter = Rc::new(Signal::new(Some(1)));
50+ /// let double = Memo::new({
51+ /// let counter = counter.clone();
52+ /// move || *counter.get() * 2
53+ /// });
54+ ///
55+ /// let run_count = Rc::new(Cell::new(0));
56+ /// let run_count_clone = run_count.clone();
57+ ///
58+ /// let effect = Effect::new({
59+ /// let double = double.clone();
60+ /// move || {
61+ /// run_count_clone.set(run_count_clone.get() + 1);
62+ /// let _ = double.get();
63+ /// }
64+ /// });
65+ ///
66+ /// let vm = ViewModel {
67+ /// counter: counter.clone(),
68+ /// double: double.clone(),
69+ /// effect: effect,
70+ /// run_count: run_count.clone(),
71+ /// };
72+ ///
73+ /// assert_eq!(run_count.get(), 1);
74+ /// vm.counter.set(4);
75+ /// assert_eq!(run_count.get(), 2);
76+ /// ```
1877pub struct Effect {
1978 f : Box < dyn Fn ( ) > ,
2079}
@@ -28,6 +87,7 @@ impl Effect {
2887 ///
2988 /// # Examples
3089 ///
90+ /// ## Basic usage
3191 /// ```
3292 /// use std::{cell::Cell, rc::Rc};
3393 /// use reactive_cache::Effect;
@@ -42,6 +102,36 @@ impl Effect {
42102 ///
43103 /// assert_eq!(counter.get(), 1);
44104 /// ```
105+ ///
106+ /// ## Using inside a struct
107+ /// ```
108+ /// use std::rc::Rc;
109+ /// use reactive_cache::{Signal, Memo, Effect};
110+ ///
111+ /// struct ViewModel {
112+ /// counter: Rc<Signal<i32>>,
113+ /// double: Rc<Memo<i32>>,
114+ /// effect: Rc<Effect>,
115+ /// }
116+ ///
117+ /// let counter = Rc::new(Signal::new(Some(1)));
118+ /// let double = Memo::new({
119+ /// let counter = counter.clone();
120+ /// move || *counter.get() * 2
121+ /// });
122+ ///
123+ /// let vm = ViewModel {
124+ /// counter: counter.clone(),
125+ /// double: double.clone(),
126+ /// effect: Effect::new({
127+ /// let double = double.clone();
128+ /// move || println!("Double is {}", double.get())
129+ /// }),
130+ /// };
131+ ///
132+ /// counter.set(3);
133+ /// assert_eq!(double.get(), 6);
134+ /// ```
45135 #[ allow( clippy:: new_ret_no_self) ]
46136 pub fn new ( f : impl Fn ( ) + ' static ) -> Rc < Effect > {
47137 let e: Rc < Effect > = Rc :: new ( Effect { f : Box :: new ( f) } ) ;
0 commit comments