decide.rb 0.5.2 → 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 +26 -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|
|
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
|