decide.rb 0.5.4 → 0.6.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67225cdb4ecbd0f8577bc2c9744e85958a6fc74252e29014bb957e0c927ee0d9
4
- data.tar.gz: 62bf259ddc73c780bc7993e4b597c90e45a047a4981263e81afdc44dcf07399a
3
+ metadata.gz: cbe851f7fea959e98b1b98f0151962c495cfb36195307b4fb44a6116fe15f4a5
4
+ data.tar.gz: 5770da3f08fe829c42489195c9f0a16e4b3f8cef174c7793d4b057a6d8f3fe20
5
5
  SHA512:
6
- metadata.gz: d7e5a790ab4d45b0d73a189ecdb19907ca139742a61f02dd146c38aa8e61619c55f744095085d89292f3f53976f60ecec17799b3dcc58166a0e5201eb3b8641a
7
- data.tar.gz: f27228fda1b9ca07c19cb01d004576ef106de6a2c96c7ce19a4a4b7976b4a5260dca7c91bb59d2404009387152ccd0ce10537e00fe9e76d0e8054992946055d3
6
+ metadata.gz: 20757b12712eda8e22c8a63705ebf06aaa5aadd3489df5119af3ac63ca58858e00fb8e128088e33dc7832dc8f66cb8debf1283fdce32e1aebfad06ea9ff91fae
7
+ data.tar.gz: 7553cf027e1e79477ba67344bd65bb35d49db76863d52f680aeb59f4ae638ce8c948fb4f81b99e4e44aa7d8a00f8613323cbd10f3b980ce55e6a29c1e8fa5235
data/CHANGELOG.md CHANGED
@@ -1,3 +1,98 @@
1
+ # 0.6.0
2
+
3
+ * All extensions takes decider as last argument
4
+
5
+ ```ruby
6
+ # Before
7
+ Decider.dimap_on_state(decider, fl:, fr:)
8
+ Decider.dimap_on_event(decider, fl:, fr:)
9
+ Decider.lmap_on_event(decider, fn)
10
+ Decider.lmap_on_command(decider, fn)
11
+ Decider.lmap_on_state(decider, fn)
12
+ Decider.rmap_on_event(decider, fn)
13
+ Decider.rmap_on_state(decider, fn)
14
+
15
+ # After
16
+ Decider.dimap_on_state(fl, fr, decider)
17
+ Decider.dimap_on_event(fl, fr, decider)
18
+ Decider.lmap_on_event(fn, decider)
19
+ Decider.lmap_on_command(fn, decider)
20
+ Decider.lmap_on_state(fn, decider)
21
+ Decider.rmap_on_event(fn, decider)
22
+ Decider.rmap_on_state(fn, decider)
23
+ ```
24
+
25
+ # 0.5.5
26
+
27
+ * Add `lmap_on_command` extension that takes proc that maps command and returns a new decider
28
+
29
+ ```ruby
30
+ decider = Decider.define do
31
+ initial_state 0
32
+
33
+ decide :increase do
34
+ emit :increased
35
+ end
36
+ end
37
+
38
+ lmap = decider.lmap_on_command(->(command) { command.to_sym })
39
+ lmap.decide("increase", 0)
40
+ # => [:increased]
41
+ ```
42
+
43
+ * Add `map` extension that works the same way as `rmap_on_state` but `Decider.map` takes function first
44
+
45
+ ```ruby
46
+ # equivalent
47
+ Decider.rmap_on_state(decider, fn)
48
+ Decider.map(fn, decider)
49
+ decider.rmap_on_state(fn)
50
+ decider.map(fn)
51
+ ```
52
+
53
+ * Add `map2` extension that takes function with two arguments and two deciders and returns a decider:
54
+
55
+ ```ruby
56
+ dx = Decider.define do
57
+ initial_state({score: 0})
58
+
59
+ decide :score do
60
+ emit :scored
61
+ end
62
+
63
+ evolve :scored do
64
+ {score: state[:score] + 1}
65
+ end
66
+ end
67
+
68
+ dy = Decider.define do
69
+ initial_state({time: 0})
70
+
71
+ decide :tick do
72
+ emit :ticked
73
+ end
74
+
75
+ evolve :ticked do
76
+ {time: state[:time] + 1}
77
+ end
78
+ end
79
+
80
+ decider = Decider.map2(
81
+ ->(sx, sy) { {score: sx[:score], time: sy[:time]} }, dx, dy
82
+ )
83
+
84
+ decider.initial_state
85
+ # => {score: 0, time: 0}
86
+ decider.decide(:score, decider.initial_state)
87
+ # => [:scored]
88
+ decider.decide(:tick, decider.initial_state)
89
+ # => [:ticked]
90
+ decider.evolve(decider.initial_state, :scored)
91
+ # => {score: 1, time: 0}
92
+ decider.evolve(decider.initial_state, :ticked)
93
+ # => {score: 0, time: 1}
94
+ ```
95
+
1
96
  # 0.5.4
2
97
 
3
98
  * Add `lmap_on_event` and `rmap_on_event` extensions that takes proc that maps event in or out and returns a new decider
@@ -7,7 +102,7 @@ decider = Decider.define do
7
102
  initial_state 0
8
103
 
9
104
  decide :increase do
10
- :increased
105
+ emit :increased
11
106
  end
12
107
 
13
108
  evolve :increased do
@@ -84,7 +179,7 @@ inner = Decider.define do
84
179
  initial_state 0
85
180
 
86
181
  decide :increase do
87
- :increased
182
+ emit :increased
88
183
  end
89
184
 
90
185
  evolve :increased do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decider
4
- VERSION = "0.5.4"
4
+ VERSION = "0.6.0"
5
5
  end
data/lib/decider.rb CHANGED
@@ -108,28 +108,36 @@ module Decider
108
108
  context.instance_exec(&terminal)
109
109
  end
110
110
 
111
+ define_method(:lmap_on_command) do |fn|
112
+ Decider.lmap_on_command(fn, self)
113
+ end
114
+
111
115
  define_method(:lmap_on_state) do |fn|
112
- Decider.lmap_on_state(self, fn)
116
+ Decider.lmap_on_state(fn, self)
117
+ end
118
+
119
+ define_method(:map) do |fn|
120
+ Decider.map(fn, self)
113
121
  end
114
122
 
115
123
  define_method(:rmap_on_state) do |fn|
116
- Decider.rmap_on_state(self, fn)
124
+ Decider.rmap_on_state(fn, self)
117
125
  end
118
126
 
119
127
  define_method(:dimap_on_state) do |fl:, fr:|
120
- Decider.dimap_on_state(self, fl: fl, fr: fr)
128
+ Decider.dimap_on_state(fl, fr, self)
121
129
  end
122
130
 
123
131
  define_method(:lmap_on_event) do |fn|
124
- Decider.lmap_on_event(self, fn)
132
+ Decider.lmap_on_event(fn, self)
125
133
  end
126
134
 
127
135
  define_method(:rmap_on_event) do |fn|
128
- Decider.rmap_on_event(self, fn)
136
+ Decider.rmap_on_event(fn, self)
129
137
  end
130
138
 
131
139
  define_method(:dimap_on_event) do |fl:, fr:|
132
- Decider.dimap_on_event(self, fl: fl, fr: fr)
140
+ Decider.dimap_on_event(fl, fr, self)
133
141
  end
134
142
  end
135
143
  end
@@ -227,15 +235,37 @@ module Decider
227
235
  end
228
236
  end
229
237
 
230
- def self.lmap_on_state(decider, fn)
231
- dimap_on_state(decider, fl: fn, fr: ->(state) { state })
238
+ def self.lmap_on_command(fn, decider)
239
+ define do
240
+ initial_state decider.initial_state
241
+
242
+ decide proc { true } do
243
+ decider.decide(fn.call(command), state).each(&method(:emit))
244
+ end
245
+
246
+ evolve proc { true } do
247
+ decider.evolve(state, event)
248
+ end
249
+
250
+ terminal? do
251
+ decider.terminal?(state)
252
+ end
253
+ end
232
254
  end
233
255
 
234
- def self.rmap_on_state(decider, fn)
235
- dimap_on_state(decider, fl: ->(state) { state }, fr: fn)
256
+ def self.lmap_on_state(fn, decider)
257
+ dimap_on_state(fn, ->(state) { state }, decider)
236
258
  end
237
259
 
238
- def self.dimap_on_state(decider, fl:, fr:)
260
+ def self.map(fn, decider)
261
+ dimap_on_state(->(state) { state }, fn, decider)
262
+ end
263
+
264
+ def self.rmap_on_state(fn, decider)
265
+ dimap_on_state(->(state) { state }, fn, decider)
266
+ end
267
+
268
+ def self.dimap_on_state(fl, fr, decider)
239
269
  define do
240
270
  initial_state fr.call(decider.initial_state)
241
271
 
@@ -253,15 +283,15 @@ module Decider
253
283
  end
254
284
  end
255
285
 
256
- def self.lmap_on_event(decider, fn)
257
- dimap_on_event(decider, fl: fn, fr: ->(event) { event })
286
+ def self.lmap_on_event(fn, decider)
287
+ dimap_on_event(fn, ->(event) { event }, decider)
258
288
  end
259
289
 
260
- def self.rmap_on_event(decider, fn)
261
- dimap_on_event(decider, fl: ->(event) { event }, fr: fn)
290
+ def self.rmap_on_event(fn, decider)
291
+ dimap_on_event(->(event) { event }, fn, decider)
262
292
  end
263
293
 
264
- def self.dimap_on_event(decider, fl:, fr:)
294
+ def self.dimap_on_event(fl, fr, decider)
265
295
  define do
266
296
  initial_state decider.initial_state
267
297
 
@@ -280,4 +310,26 @@ module Decider
280
310
  end
281
311
  end
282
312
  end
313
+
314
+ def self.map2(fn, dx, dy)
315
+ define do
316
+ initial_state fn.call(dx.initial_state, dy.initial_state)
317
+
318
+ decide proc { true } do
319
+ dx.decide(command, state).each(&method(:emit))
320
+ dy.decide(command, state).each(&method(:emit))
321
+ end
322
+
323
+ evolve proc { true } do
324
+ fn.call(
325
+ dx.evolve(state, event),
326
+ dy.evolve(state, event)
327
+ )
328
+ end
329
+
330
+ terminal? do
331
+ dx.terminal?(state) && dy.terminal?(state)
332
+ end
333
+ end
334
+ end
283
335
  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
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Dudulski
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-06-21 00:00:00.000000000 Z
10
+ date: 2025-06-22 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby