1+ // PoC for Restate library: Let's make useReducer great again!
2+ // Redux like architecture with modern React effects approach.
3+
4+ /** API Types **/
5+ type dispatch <'action > = 'action => unit // Reducer Trigger Function
6+ type schedule <'deferredAction > = 'deferredAction => unit // Scheduler Trigger Function
7+ // Magic Types based on ReactUpdate library
8+ type update <'state , 'deferredAction > =
9+ | NoUpdate // no update
10+ | Update ('state ) // update only
11+ | UpdateWithDeferred ('state , 'deferredAction ) // update and defer a deferred action
12+ | Deferred ('deferredAction ) // no update, but defer a deferred action
13+ // Shape of Restate Reducer
14+ type self <'state , 'action , 'deferredAction > = {
15+ send : dispatch <'action >,
16+ defer : schedule <'deferredAction >,
17+ state : 'state ,
18+ }
19+ // React Reducers looks like this:
20+ // type reducer<'state, 'action> = ('state, 'action) => 'state
21+ // vs Restate Reducer "reduce" function:
22+ type reducer <'state , 'action , 'deferredAction > = ('state , 'action ) => update <'state , 'deferredAction >
23+ // ^ Main difference is that our reduce function is wrapped in an custom "update" type.
24+ type scheduler <'state , 'action , 'deferredAction > = (self <'state , 'action , 'deferredAction >, 'deferredAction ) => option <unit => unit >
25+ // ^ Scheduler is like an impure reducer that group the async/side effects actions related code.
26+ // But instead of dispatch actions inmmediatly, in their case, we differ them into a queue.
27+
28+ let useReducer : (
29+ reducer <'state , 'action , 'deferredAction >, // The reducer provided by the user
30+ scheduler <'state , 'action , 'deferredAction >, // The scheduler provided by the user
31+ 'state ,
32+ ) => ('state , dispatch <'action >, schedule <'deferredAction >)
33+
34+ let useReducerWithMapState : (
35+ reducer <'state , 'action , 'deferredAction >, // The reducer provided by the user
36+ scheduler <'state , 'action , 'deferredAction >, // The scheduler provided by the user
37+ unit => 'state ,
38+ ) => ('state , dispatch <'action >, schedule <'deferredAction >)
0 commit comments