Skip to content

Commit 66ec37d

Browse files
Simplify interface by using Rescript Core Map
1 parent 62ffca5 commit 66ec37d

File tree

5 files changed

+225
-198
lines changed

5 files changed

+225
-198
lines changed

examples/BasicUsage.res

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,16 @@ module ReactRestate = {
3737
type action = Tick | Reset
3838
type state = {elapsed: int}
3939
type deferredAction = ScheduleNextTick
40-
module DeferredAction: Restate.HasDeferredAction with type t = deferredAction = {
41-
type t = deferredAction
42-
let variantId = action =>
43-
switch action {
44-
| ScheduleNextTick => "ScheduleNextTick"
45-
}
46-
}
47-
module RestateReducer = Restate.MakeReducer(DeferredAction)
4840
let reducer = (state, action) =>
4941
switch action {
5042
| Tick =>
51-
RestateReducer.UpdateWithDeferred(
43+
Restate.UpdateWithDeferred(
5244
{elapsed: state.elapsed + 1},
5345
ScheduleNextTick
5446
)
55-
| Reset => RestateReducer.Update({elapsed: 0})
47+
| Reset => Restate.Update({elapsed: 0})
5648
}
57-
let scheduler: (RestateReducer.self<state, action>, deferredAction) => option<unit=>unit> =
49+
let scheduler: (Restate.self<state, action, 'deferredAction>, deferredAction) => option<unit=>unit> =
5850
(self, action) =>
5951
switch action {
6052
| ScheduleNextTick =>
@@ -67,7 +59,7 @@ module ReactRestate = {
6759
}
6860
@react.component
6961
let make = () => {
70-
let (state, send, _defer) = RestateReducer.useReducerWithMapState(reducer, scheduler, () => {elapsed: 0})
62+
let (state, send, _defer) = Restate.useReducerWithMapState(reducer, scheduler, () => {elapsed: 0})
7163
React.useEffect0(() => {
7264
send(Tick)
7365
None

examples/Counter_SideEffects.res

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,29 +50,21 @@ module ReactRestate = {
5050
type deferredAction =
5151
| LogIncrement
5252
| LogDecrement
53-
module DeferredAction: Restate.HasDeferredAction with type t = deferredAction = {
54-
type t = deferredAction
55-
let variantId = action =>
56-
switch action {
57-
| LogIncrement => "LogIncrement"
58-
| LogDecrement => "LogDecrement"
59-
}
60-
}
61-
module RestateReducer = Restate.MakeReducer(DeferredAction)
53+
6254
let reducer = (state, action) =>
6355
switch action {
6456
| Increment =>
65-
RestateReducer.UpdateWithDeferred(
57+
Restate.UpdateWithDeferred(
6658
state + 1,
6759
LogIncrement,
6860
)
6961
| Decrement =>
70-
RestateReducer.UpdateWithDeferred(
62+
Restate.UpdateWithDeferred(
7163
state - 1,
7264
LogDecrement,
7365
)
7466
}
75-
let scheduler: (RestateReducer.self<state, action>, deferredAction) => option<unit=>unit> =
67+
let scheduler: (Restate.self<state, action, deferredAction>, deferredAction) => option<unit=>unit> =
7668
(self, deferredAction) =>
7769
switch deferredAction {
7870
| LogIncrement =>
@@ -86,7 +78,7 @@ module ReactRestate = {
8678
}
8779
@react.component
8880
let make = () => {
89-
let (state, send, _defer) = RestateReducer.useReducer(reducer, scheduler, 0)
81+
let (state, send, _defer) = Restate.useReducer(reducer, scheduler, 0)
9082
<div>
9183
{state->React.int}
9284
<button onClick={_ => send(Decrement)}> {"-"->React.string} </button>

src/Internal_Iterator.res

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
type t<'a>
2+
3+
type value<'a> = {
4+
done: bool,
5+
value: option<'a>,
6+
}
7+
8+
@send external next: t<'a> => value<'a> = "next"
9+
external toArray: t<'a> => array<'a> = "Array.from"
10+
external toArrayWithMapper: (t<'a>, 'a => 'b) => array<'b> = "Array.from"
11+
12+
let forEach = (iterator, f) => {
13+
let iteratorDone = ref(false)
14+
15+
while !iteratorDone.contents {
16+
let {done, value} = iterator->next
17+
f(value)
18+
iteratorDone := done
19+
}
20+
}

src/Internal_Map.res

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
type t<'k, 'v> = Js.Map.t<'k, 'v>
2+
3+
@new external make: unit => t<'k, 'v> = "Map"
4+
@new external fromArray: array<('k, 'v)> => t<'k, 'v> = "Map"
5+
6+
@get external size: t<'k, 'v> => int = "size"
7+
8+
@send external clear: t<'k, 'v> => unit = "clear"
9+
10+
@send external forEach: (t<'k, 'v>, 'v => unit) => unit = "forEach"
11+
@send external forEachWithKey: (t<'k, 'v>, ('v, 'k) => unit) => unit = "forEach"
12+
13+
@send external get: (t<'k, 'v>, 'k) => option<'v> = "get"
14+
@send external has: (t<'k, 'v>, 'k) => bool = "has"
15+
@send external set: (t<'k, 'v>, 'k, 'v) => unit = "set"
16+
@send external delete: (t<'k, 'v>, 'k) => bool = "delete"
17+
18+
@send external keys: t<'k, 'v> => Internal_Iterator.t<'k> = "keys"
19+
@send external values: t<'k, 'v> => Internal_Iterator.t<'v> = "values"
20+
@send external entries: t<'k, 'v> => Internal_Iterator.t<('k, 'v)> = "entries"

0 commit comments

Comments
 (0)