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 *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 store.stop();
108
109 assert_eq!(store.get_state().count, 0);
110}