decide.rb 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +64 -0
- data/lib/decider/version.rb +1 -1
- data/lib/decider.rb +50 -18
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d34cbcdaf2713fe8bd44d975d9d9bd40801af014cc84e3e37c69bee8ef14b1b2
|
4
|
+
data.tar.gz: 8f82294e16473b2ae75040cd5b1da79c3ddca4d77f103ea86c57a498f004b1d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 400fb7bb3bb77f17578bf15b36f4d88213694562c1626736c0433ddce2b1fa43ad84dd3a87b6b8eb641f862838aff0848210fe40caeffb20234779aa6db0b8be
|
7
|
+
data.tar.gz: 7b8ecedf12b070c414aa7a41d30675d0038f439f6d892990ad74a9289ad3d2df006c78ea402557b3f80c2ec36343d434563b44d58f267b30af919d848ded3469
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,67 @@
|
|
1
|
+
# 0.5.3
|
2
|
+
|
3
|
+
* Add shortcut for evolving:
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
# this three are the same now
|
7
|
+
[event, event].reduce(state) { |s, e| decider.evolve(s, e) }
|
8
|
+
[event, event].reduce(state, &decider.method(:evolve))
|
9
|
+
|
10
|
+
# new
|
11
|
+
[event, event].reduce(state, &decider.evolve)
|
12
|
+
```
|
13
|
+
|
14
|
+
# 0.5.2
|
15
|
+
|
16
|
+
* Add `dimap_on_event` extension that takes procs that maps event in and out and returns a new decider
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
inner = Decider.define do
|
20
|
+
initial_state 0
|
21
|
+
|
22
|
+
decide :increase do
|
23
|
+
:increased
|
24
|
+
end
|
25
|
+
|
26
|
+
evolve :increased do
|
27
|
+
state + 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
outer = decider.dimap_on_event(
|
32
|
+
fl: ->(event) { event.to_sym },
|
33
|
+
fr: ->(event) { event.to_s }
|
34
|
+
)
|
35
|
+
|
36
|
+
outer.decide(:increase, 0)
|
37
|
+
# => "increased"
|
38
|
+
|
39
|
+
outer.evolve(0, "increased")
|
40
|
+
# => 1
|
41
|
+
```
|
42
|
+
|
43
|
+
# 0.5.1
|
44
|
+
|
45
|
+
* Add `dimap_on_state` extension that takes procs that maps state in and out and returns a new decider
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
inner = Decider.define do
|
49
|
+
initial_state :symbol
|
50
|
+
end
|
51
|
+
inner.initial_state
|
52
|
+
# => :symbol
|
53
|
+
|
54
|
+
outer = decider.dimap_on_state(
|
55
|
+
fl: ->(state) { state.to_sym },
|
56
|
+
fr: ->(state) { state.to_s }
|
57
|
+
)
|
58
|
+
outer.initial_state
|
59
|
+
# => "symbol"
|
60
|
+
|
61
|
+
# under the hood it will run inner.decide(:command, :symbol)
|
62
|
+
outer.decide(:command, "symbol")
|
63
|
+
```
|
64
|
+
|
1
65
|
# 0.5.0
|
2
66
|
|
3
67
|
* Support pattern matching for commands and events
|
data/lib/decider/version.rb
CHANGED
data/lib/decider.rb
CHANGED
@@ -47,7 +47,11 @@ module Decider
|
|
47
47
|
_events.push(*events)
|
48
48
|
end
|
49
49
|
end
|
50
|
-
Evolve = Data.define(:state, :event)
|
50
|
+
Evolve = Data.define(:state, :event) do
|
51
|
+
def self.build(state, event)
|
52
|
+
new(state: state, event: event)
|
53
|
+
end
|
54
|
+
end
|
51
55
|
Terminal = Data.define(:state)
|
52
56
|
|
53
57
|
def initialize(initial_state:, deciders:, evolutions:, terminal:)
|
@@ -75,23 +79,27 @@ module Decider
|
|
75
79
|
context._events
|
76
80
|
end
|
77
81
|
|
78
|
-
define_method(:evolve) do |
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
82
|
+
define_method(:evolve) do |*args|
|
83
|
+
if args.empty?
|
84
|
+
->(state, event) { evolve(state, event) }
|
85
|
+
else
|
86
|
+
context = Evolve.build(*args)
|
87
|
+
|
88
|
+
evolutions.find(EVOLVE_FALLBACK) do |args, _|
|
89
|
+
case args
|
90
|
+
in [Proc => fn]
|
91
|
+
context.instance_exec(&fn)
|
92
|
+
in [etype]
|
93
|
+
context.event in ^etype
|
94
|
+
in [stype, etype]
|
95
|
+
[context.state, context.event] in [^stype, ^etype]
|
96
|
+
else
|
97
|
+
false
|
98
|
+
end
|
99
|
+
end => [_, handler]
|
100
|
+
|
101
|
+
context.instance_exec(&handler)
|
102
|
+
end
|
95
103
|
end
|
96
104
|
|
97
105
|
define_method(:terminal?) do |state|
|
@@ -103,6 +111,10 @@ module Decider
|
|
103
111
|
define_method(:dimap_on_state) do |fl:, fr:|
|
104
112
|
Decider.dimap_on_state(self, fl: fl, fr: fr)
|
105
113
|
end
|
114
|
+
|
115
|
+
define_method(:dimap_on_event) do |fl:, fr:|
|
116
|
+
Decider.dimap_on_event(self, fl: fl, fr: fr)
|
117
|
+
end
|
106
118
|
end
|
107
119
|
end
|
108
120
|
|
@@ -216,4 +228,24 @@ module Decider
|
|
216
228
|
end
|
217
229
|
end
|
218
230
|
end
|
231
|
+
|
232
|
+
def self.dimap_on_event(decider, fl:, fr:)
|
233
|
+
define do
|
234
|
+
initial_state decider.initial_state
|
235
|
+
|
236
|
+
decide proc { true } do
|
237
|
+
decider.decide(command, state).each do |event|
|
238
|
+
emit fr.call(event)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
evolve proc { true } do
|
243
|
+
decider.evolve(state, fl.call(event))
|
244
|
+
end
|
245
|
+
|
246
|
+
terminal? do
|
247
|
+
decider.terminal?(state)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
219
251
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decide.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Dudulski
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-04-
|
10
|
+
date: 2025-04-15 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: concurrent-ruby
|