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 *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 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}