decide.rb 0.6.0 → 0.6.2

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: cbe851f7fea959e98b1b98f0151962c495cfb36195307b4fb44a6116fe15f4a5
4
- data.tar.gz: 5770da3f08fe829c42489195c9f0a16e4b3f8cef174c7793d4b057a6d8f3fe20
3
+ metadata.gz: cdfca1b85746ead6ae446e0b9bfb697a4cfb08685581cabe78cf6462d88db9a4
4
+ data.tar.gz: ab375b8863a3e88c39e3f8ce3c6c7957758b2d557c7770f260ba4278843a6fea
5
5
  SHA512:
6
- metadata.gz: 20757b12712eda8e22c8a63705ebf06aaa5aadd3489df5119af3ac63ca58858e00fb8e128088e33dc7832dc8f66cb8debf1283fdce32e1aebfad06ea9ff91fae
7
- data.tar.gz: 7553cf027e1e79477ba67344bd65bb35d49db76863d52f680aeb59f4ae638ce8c948fb4f81b99e4e44aa7d8a00f8613323cbd10f3b980ce55e6a29c1e8fa5235
6
+ metadata.gz: '08fa1bb4c0444cc2a843b853cf9d6050910574c161a409fda2a65f4e628c014abd55416c5e5ef4e4ddeae8b182673186ce61998bba2187cfcb37521ed81dcd60'
7
+ data.tar.gz: 968ddeb2cd7fac20a82f409c047083d375be4eec79a3c99c0596b8d1bc78ac14000431ddfdc5d66bd20d3ba23f6a6e173a88ec098245e8b461efcc9af818e713
data/CHANGELOG.md CHANGED
@@ -1,3 +1,34 @@
1
+ # 0.6.2
2
+
3
+ * Add `many` extension that takes a decider and manage many instances
4
+
5
+ ```ruby
6
+ deciders = Decider.many(decider)
7
+ # or
8
+ deciders = decider.many
9
+
10
+ deciders.initial_state
11
+ # => {}
12
+
13
+ deciders.decide([id, command], state)
14
+ # => [[id, event], [id, event]]
15
+
16
+ deciders.evolve(state, [id, event])
17
+ # => state
18
+ ```
19
+
20
+ # 0.6.1
21
+
22
+ * Add `apply` extension for creating applicatives
23
+
24
+ ```ruby
25
+ decider = Decider.map(fn.curry, deciderx)
26
+ decider = Decider.apply(decider, decidery)
27
+ decider = Decider.apply(decider, deciderz)
28
+ # or
29
+ deciderx.map(fn.curry).apply(decidery).apply(deciderz)
30
+ ```
31
+
1
32
  # 0.6.0
2
33
 
3
34
  * All extensions takes decider as last argument
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decider
4
- VERSION = "0.6.0"
4
+ VERSION = "0.6.2"
5
5
  end
data/lib/decider.rb CHANGED
@@ -139,6 +139,14 @@ module Decider
139
139
  define_method(:dimap_on_event) do |fl:, fr:|
140
140
  Decider.dimap_on_event(fl, fr, self)
141
141
  end
142
+
143
+ define_method(:many) do
144
+ Decider.many(self)
145
+ end
146
+
147
+ define_method(:apply) do |f|
148
+ Decider.apply(self, f)
149
+ end
142
150
  end
143
151
  end
144
152
 
@@ -311,6 +319,39 @@ module Decider
311
319
  end
312
320
  end
313
321
 
322
+ def self.many(decider)
323
+ define do
324
+ initial_state({})
325
+
326
+ decide proc { [command, state] in [[_id, _], Hash] } do
327
+ command => [id, command]
328
+
329
+ ds = state.fetch(id) { decider.initial_state }
330
+
331
+ decider.decide(command, ds).each do |event|
332
+ emit [id, event]
333
+ end
334
+ end
335
+
336
+ evolve proc { [state, event] in [Hash, [_id, _]] } do
337
+ event => [id, event]
338
+
339
+ ds = state.fetch(id) { decider.initial_state }
340
+ ds = decider.evolve(ds, event)
341
+
342
+ state.merge(id => ds)
343
+ end
344
+
345
+ terminal? do
346
+ state.any? && state.all? { |_, ds| decider.terminal?(ds) }
347
+ end
348
+ end
349
+ end
350
+
351
+ def self.apply(f, x)
352
+ map2(->(f, x) { f.call(x) }, f, x)
353
+ end
354
+
314
355
  def self.map2(fn, dx, dy)
315
356
  define do
316
357
  initial_state fn.call(dx.initial_state, dy.initial_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.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Dudulski
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-06-22 00:00:00.000000000 Z
10
+ date: 2025-06-23 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby