Skip to content

Commit 00d054d

Browse files
Add .resi
1 parent 66ec37d commit 00d054d

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/Restate.res

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ type internalState<'action, 'state, 'deferredAction> = {
3838
deferredActionsQueue: Belt.List.t<'deferredAction>,
3939
}
4040

41-
// /** Usage: **/
42-
// 1. Init module;
43-
// module RestateReducer = Restate.MakeReducer(DeferredActions)
44-
// 2. Use the Hook;
45-
// RestateReduser.useReducer(reducer, scheduler, initialState)
4641
let useReducer = (
4742
reducer: reducer<'state, 'action, 'deferredAction>, // The reducer provided by the user
4843
scheduler: scheduler<'state, 'action, 'deferredAction>, // The scheduler provided by the user
@@ -132,10 +127,8 @@ let useReducer = (
132127
let useReducerWithMapState = (
133128
reducer: reducer<'state, 'action, 'deferredAction>, // The reducer provided by the user
134129
scheduler: scheduler<'state, 'action, 'deferredAction>, // The scheduler provided by the user
135-
createInitialState: unit => 'state,
130+
createInitialState: unit => 'state, // A function to map the initial state
136131
) => {
137-
// A function to map the initial state
138-
139132
let cleanupFnsRef: React.ref<
140133
Internal_Map.t<'deferredAction, option<unit => unit>>,
141134
> = React.useRef(Internal_Map.make())

src/Restate.resi

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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

Comments
 (0)