Skip to content

Commit 68cf047

Browse files
committed
📝 Update examples
1 parent 34af518 commit 68cf047

File tree

3 files changed

+113
-35
lines changed

3 files changed

+113
-35
lines changed

examples/decide.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ decider = Decider.define do
1818
end
1919

2020
decider.decide Command.new(value: 10), decider.initial_state
21-
#> [Event.new(value: 15)]
21+
#> [#<data Event value=15>]
2222
```
2323

2424
## Match by command and state
@@ -138,7 +138,7 @@ decider = Decider.define do
138138
emit [:started, command.value]
139139
end
140140

141-
decide proc { [command, state] in [Stop, [:started, _]] } do
141+
decide proc { [command, state] in [Stop, :started] } do
142142
emit :stopped
143143
end
144144
end

examples/evolve.md

Lines changed: 98 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,88 @@
11
# Evolve
22

3-
## Handling unknown events
3+
## Match by event
44

55
```ruby
6+
Event = Data.define(:value)
7+
68
decider = Decider.define do
79
initial_state :initial
10+
11+
evolve Event do
12+
event.value
13+
end
814
end
15+
16+
decider.evolve decider.initial_state, Event.new(value: :changed)
17+
#> :changed
918
```
1019

11-
Return state (nothing changed) by default:
20+
## Match by state and event
1221

1322
```ruby
23+
decider = Decider.define do
24+
initial_state :turned_off
25+
26+
evolve :turned_on, :turned_off do
27+
event
28+
end
29+
30+
evolve :turned_off, :turned_on do
31+
event
32+
end
33+
end
34+
35+
decider.evolve decider.initial_state, :turned_on
36+
#> :turned_on
37+
decider.evolve :turned_on, :turned_off
38+
#> :turned_off
39+
decider.evolve :turned_on, :unknown
40+
#> :turned_on
41+
```
42+
43+
## Match by pattern matching
44+
45+
```ruby
46+
State = Data.define(:value)
47+
Event = Data.define(:value)
48+
49+
decider = Decider.define do
50+
initial_state State.new(value: :turned_off)
51+
52+
evolve proc { [state, event] in [State(value: :turned_off), Event(value: :turned_on)] } do
53+
state.with(value: event.value)
54+
end
55+
end
56+
57+
decider.evolve decider.initial_state, Event.new(value: :turned_on)
58+
#> #<data State value=:turned_on>
1459
decider.evolve decider.initial_state, :unknown
60+
#> #<data State value=:turned_off>
61+
```
62+
63+
## Handling unknown events
64+
65+
```ruby
66+
decider = Decider.define do
67+
initial_state :initial
68+
end
69+
70+
decider.decide decider.initial_state, :initial
1571
#> :initial
1672
```
1773

18-
Raise error when using `evolve!`:
74+
If you want to raise error, define a catch-all as last one:
1975

2076
```ruby
21-
decider.evolve! decider.initial_state, :unknown
22-
#> raise ArgumentError, Unknown event
77+
decider = Decider.define do
78+
initial_state :initial
79+
80+
evolve proc { true } do
81+
raise ArgumentError, "Unknown event #{event}"
82+
end
83+
end
84+
decider.evolve decider.initial_state, :unknown
85+
#> Unknown event unknown (ArgumentError)
2386
```
2487

2588
## Events
@@ -30,11 +93,11 @@ Events can be primitives like symbols:
3093
decider = Decider.define do
3194
initial_state :initial
3295

33-
evolve :started do |state, event|
96+
evolve :started do
3497
:started
3598
end
3699

37-
evolve :stopped do |state, event|
100+
evolve :stopped do
38101
:stopped
39102
end
40103
end
@@ -50,13 +113,38 @@ Stopped = Data.define
50113
decider = Decider.define do
51114
initial_state State.new(speed: 0)
52115

53-
evolve Started do |state, event|
54-
State.new(speed: event.speed)
116+
evolve State, Started do
117+
state.with(speed: event.speed)
55118
end
56119

57-
evolve Stopped do |state, event|
120+
evolve State, Stopped do
58121
State.new(speed: 0)
59122
end
60123
end
61124
```
62125

126+
## Calculate state
127+
128+
In most cases you want to take a collection of events and reduce them with `evolve` to calculate the state, like:
129+
130+
```ruby
131+
decider = Decider.define do
132+
initial_state 0
133+
134+
evolve :increased do
135+
state + 1
136+
end
137+
end
138+
139+
[:increased, :increased].reduce(decider.initial_state) { |state, event| decider.evolve(state, event) }
140+
#> 2
141+
```
142+
143+
You can shortcut that with `&`:
144+
145+
```ruby
146+
[:increased, :increased].reduce(decider.initial_state, &decider.method(:evolve))
147+
#> 2
148+
[:increased, :increased].reduce(decider.initial_state, &decider.evolve)
149+
#> 2
150+
```

examples/state.md

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ State = Data.define(:value)
88
decider = Decider.define do
99
initial_state State.new(value: 0)
1010

11-
decide Commands::Command do |command, state|
12-
[Events::Event.new(value: command.value)]
11+
decide Commands::Command do
12+
emit Events::Event.new(value: command.value)
1313
end
1414

15-
evolve Events::Event do |state, event|
15+
evolve Events::Event do
1616
state.with(value: state.value + 1)
1717
end
1818
end
@@ -24,26 +24,16 @@ end
2424
decider = Decider.define do
2525
initial_state :turned_off
2626

27-
decide Commands::TurnOn do |_command, state|
28-
case state
29-
in :turned_off
30-
[Events::TurnedOn.new]
31-
else
32-
[]
33-
end
27+
decide Commands::TurnOn, :turned_off do
28+
emit Events::TurnedOn.new
3429
end
3530

36-
decide Commands::TurnOff do |_command, state|
37-
case state
38-
in :turned_on
39-
[Events::TurnedOn.new]
40-
else
41-
[]
42-
end
31+
decide Commands::TurnOff, :turned_on do
32+
emit Events::TurnedOff.new
4333
end
4434

45-
evolve Events::TurnedOn do |_state, _event|
46-
:turned_off
35+
evolve Events::TurnedOn do
36+
:turned_on
4737
end
4838
end
4939
```
@@ -54,12 +44,12 @@ end
5444
decider = Decider.define do
5545
initial_state []
5646

57-
decide Commands::Command do |command, _state|
58-
[Events::Event.new(value: command.value)]
47+
decide Commands::Command, [] do
48+
emit Events::Event.new(value: command.value)
5949
end
6050

61-
evolve Events::Event do |state, event|
62-
state = state + [event]
51+
evolve Events::Event do
52+
state + [event]
6353
end
6454
end
6555
```

0 commit comments

Comments
 (0)