calc_fn_basic/
calc_fn_basic.rs

1use std::sync::Arc;
2use std::thread;
3
4use rs_store::{DispatchOp, StoreBuilder};
5use rs_store::{FnReducer, FnSubscriber};
6
7#[derive(Debug, Clone)]
8enum CalcAction {
9    Add(i32),
10    Subtract(i32),
11}
12
13#[derive(Debug, Clone)]
14struct CalcState {
15    count: i32,
16}
17
18impl Default for CalcState {
19    fn default() -> CalcState {
20        CalcState { count: 0 }
21    }
22}
23
24fn calc_reducer(state: &CalcState, action: &CalcAction) -> DispatchOp<CalcState, CalcAction> {
25    match action {
26        CalcAction::Add(i) => {
27            println!("CalcReducer::reduce: + {}", i);
28            DispatchOp::Dispatch(
29                CalcState {
30                    count: state.count + i,
31                },
32                None,
33            )
34        }
35        CalcAction::Subtract(i) => {
36            println!("CalcReducer::reduce: - {}", i);
37            DispatchOp::Dispatch(
38                CalcState {
39                    count: state.count - i,
40                },
41                None,
42            )
43        }
44    }
45}
46
47fn calc_subscriber(state: &CalcState, action: &CalcAction) {
48    match action {
49        CalcAction::Add(i) => {
50            println!("CalcSubscriber::on_notify: state:{:?}, action:{}", state, i);
51        }
52        CalcAction::Subtract(i) => {
53            println!("CalcSubscriber::on_notify: state:{:?}, action:{}", state, i);
54        }
55    }
56}
57
58pub fn main() {
59    println!("Hello, reduce function !");
60
61    let store = StoreBuilder::new_with_reducer(
62        CalcState::default(),
63        Box::new(FnReducer::from(calc_reducer)),
64    )
65    .with_name("store-reduce-fn".into())
66    .build()
67    .unwrap();
68
69    store.add_subscriber(Arc::new(FnSubscriber::from(calc_subscriber)));
70    let _ = store.dispatch(CalcAction::Add(1));
71
72    thread::sleep(std::time::Duration::from_secs(1));
73    store.add_subscriber(Arc::new(FnSubscriber::from(calc_subscriber)));
74    let _ = store.dispatch(CalcAction::Subtract(1));
75
76    store.stop();
77}