calc_basic/
calc_basic.rs

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