calc_basic/
calc_basic.rs

1use rs_store::DispatchOp;
2use rs_store::Dispatcher;
3use rs_store::{Reducer, StoreImpl, Subscriber};
4use std::sync::{Arc, Mutex};
5
6#[derive(Debug, Clone)]
7enum CalcAction {
8    Add(i32),
9    Subtract(i32),
10}
11
12struct CalcReducer {}
13
14impl Default for CalcReducer {
15    fn default() -> CalcReducer {
16        CalcReducer {}
17    }
18}
19
20#[derive(Debug, Clone)]
21struct CalcState {
22    count: i32,
23}
24
25impl Default for CalcState {
26    fn default() -> CalcState {
27        CalcState { count: 0 }
28    }
29}
30
31impl Reducer<CalcState, CalcAction> for CalcReducer {
32    fn reduce(&self, state: &CalcState, action: &CalcAction) -> DispatchOp<CalcState, CalcAction> {
33        match action {
34            CalcAction::Add(i) => {
35                println!("CalcReducer::reduce: + {}", i);
36                DispatchOp::Dispatch(
37                    CalcState {
38                        count: state.count + i,
39                    },
40                    vec![],
41                )
42            }
43            CalcAction::Subtract(i) => {
44                println!("CalcReducer::reduce: - {}", i);
45                DispatchOp::Dispatch(
46                    CalcState {
47                        count: state.count - i,
48                    },
49                    vec![],
50                )
51            }
52        }
53    }
54}
55
56#[derive(Debug)]
57struct CalcSubscriber {
58    last: Mutex<CalcState>,
59}
60
61impl Default for CalcSubscriber {
62    fn default() -> CalcSubscriber {
63        CalcSubscriber {
64            last: Default::default(),
65        }
66    }
67}
68
69impl Subscriber<CalcState, CalcAction> for CalcSubscriber {
70    fn on_notify(&self, state: &CalcState, action: &CalcAction) {
71        match action {
72            CalcAction::Add(_i) => {
73                println!(
74                    "CalcSubscriber::on_notify: state:{:?} <- last {:?} + action:{:?}",
75                    state,
76                    self.last.lock().unwrap(),
77                    action
78                );
79            }
80            CalcAction::Subtract(_i) => {
81                println!(
82                    "CalcSubscriber::on_notify: state:{:?} <- last {:?} + action:{:?}",
83                    state,
84                    self.last.lock().unwrap(),
85                    action
86                );
87            }
88        }
89        //
90        *self.last.lock().unwrap() = state.clone();
91    }
92}
93
94pub fn main() {
95    println!("Hello, Basic!");
96
97    let store = StoreImpl::<CalcState, CalcAction>::new_with_reducer(
98        CalcState::default(),
99        Box::new(CalcReducer::default()),
100    )
101    .unwrap();
102
103    println!("add subscriber");
104    store.add_subscriber(Arc::new(CalcSubscriber::default())).unwrap();
105    store.dispatch(CalcAction::Add(1)).expect("no dispatch failed");
106    store.dispatch(CalcAction::Subtract(1)).expect("no dispatch failed");
107
108    // stop the store
109    match store.stop() {
110        Ok(_) => println!("store stopped"),
111        Err(e) => {
112            panic!("store stop failed  : {:?}", e);
113        }
114    }
115
116    assert_eq!(store.get_state().count, 0);
117}