decide.rb 0.5.4 → 0.5.5

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: a644014eccc9464b607d16d44c6181de06b712c1aab8e2d33d407de838723fe8
4
+ data.tar.gz: 1dbdd3c6a7b3b7efa189d857afa28da43d4f72ac1cc3ca72801bb86b854dfa73
5
5
  SHA512:
6
- metadata.gz: d7e5a790ab4d45b0d73a189ecdb19907ca139742a61f02dd146c38aa8e61619c55f744095085d89292f3f53976f60ecec17799b3dcc58166a0e5201eb3b8641a
7
- data.tar.gz: f27228fda1b9ca07c19cb01d004576ef106de6a2c96c7ce19a4a4b7976b4a5260dca7c91bb59d2404009387152ccd0ce10537e00fe9e76d0e8054992946055d3
6
+ metadata.gz: 751a52fb88eef2b129cd439765c6d9083759fd3eda0727b831202d4a903e86532fc41ba4633753f0a3318aa197d64a974d612c3d8abedc0fe102d1c28a101fd7
7
+ data.tar.gz: 2b658d6758c820c6d199c59a0275ea4cf49eee221570c4c8447f72b240207e9f717e1f3537da02f67512baf3976e448d7611ca49bbf5088032f88e79b2b89989
data/CHANGELOG.md CHANGED
@@ -1,3 +1,74 @@
1
+ # 0.5.5
2
+
3
+ * Add `lmap_on_command` extension that takes proc that maps command and returns a new decider
4
+
5
+ ```ruby
6
+ decider = Decider.define do
7
+ initial_state 0
8
+
9
+ decide :increase do
10
+ emit :increased
11
+ end
12
+ end
13
+
14
+ lmap = decider.lmap_on_command(->(command) { command.to_sym })
15
+ lmap.decide("increase", 0)
16
+ # => [:increased]
17
+ ```
18
+
19
+ * Add `map` extension that works the same way as `rmap_on_state` but `Decider.map` takes function first
20
+
21
+ ```ruby
22
+ # equivalent
23
+ Decider.rmap_on_state(decider, fn)
24
+ Decider.map(fn, decider)
25
+ decider.rmap_on_state(fn)
26
+ decider.map(fn)
27
+ ```
28
+
29
+ * Add `map2` extension that takes function with two arguments and two deciders and returns a decider:
30
+
31
+ ```ruby
32
+ dx = Decider.define do
33
+ initial_state({score: 0})
34
+
35
+ decide :score do
36
+ emit :scored
37
+ end
38
+
39
+ evolve :scored do
40
+ {score: state[:score] + 1}
41
+ end
42
+ end
43
+
44
+ dy = Decider.define do
45
+ initial_state({time: 0})
46
+
47
+ decide :tick do
48
+ emit :ticked
49
+ end
50
+
51
+ evolve :ticked do
52
+ {time: state[:time] + 1}
53
+ end
54
+ end
55
+
56
+ decider = Decider.map2(
57
+ ->(sx, sy) { {score: sx[:score], time: sy[:time]} }, dx, dy
58
+ )
59
+
60
+ decider.initial_state
61
+ # => {score: 0, time: 0}
62
+ decider.decide(:score, decider.initial_state)
63
+ # => [:scored]
64
+ decider.decide(:tick, decider.initial_state)
65
+ # => [:ticked]
66
+ decider.evolve(decider.initial_state, :scored)
67
+ # => {score: 1, time: 0}
68
+ decider.evolve(decider.initial_state, :ticked)
69
+ # => {score: 0, time: 1}
70
+ ```
71
+
1
72
  # 0.5.4
2
73
 
3
74
  * 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 +78,7 @@ decider = Decider.define do
7
78
  initial_state 0
8
79
 
9
80
  decide :increase do
10
- :increased
81
+ emit :increased
11
82
  end
12
83
 
13
84
  evolve :increased do
@@ -84,7 +155,7 @@ inner = Decider.define do
84
155
  initial_state 0
85
156
 
86
157
  decide :increase do
87
- :increased
158
+ emit :increased
88
159
  end
89
160
 
90
161
  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.5.5"
5
5
  end
data/lib/decider.rb CHANGED
@@ -108,10 +108,18 @@ 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(self, fn)
113
+ end
114
+
111
115
  define_method(:lmap_on_state) do |fn|
112
116
  Decider.lmap_on_state(self, fn)
113
117
  end
114
118
 
119
+ define_method(:map) do |fn|
120
+ Decider.map(fn, self)
121
+ end
122
+
115
123
  define_method(:rmap_on_state) do |fn|
116
124
  Decider.rmap_on_state(self, fn)
117
125
  end
@@ -227,10 +235,32 @@ module Decider
227
235
  end
228
236
  end
229
237
 
238
+ def self.lmap_on_command(decider, fn)
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
254
+ end
255
+
230
256
  def self.lmap_on_state(decider, fn)
231
257
  dimap_on_state(decider, fl: fn, fr: ->(state) { state })
232
258
  end
233
259
 
260
+ def self.map(fn, decider)
261
+ dimap_on_state(decider, fl: ->(state) { state }, fr: fn)
262
+ end
263
+
234
264
  def self.rmap_on_state(decider, fn)
235
265
  dimap_on_state(decider, fl: ->(state) { state }, fr: fn)
236
266
  end
@@ -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.5.5
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