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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8af0a9aa14ef5a19fce005eba64d4b4504277493434c4091510e49f1378a39
4
- data.tar.gz: 4ca62248b625d9bc3926749565c0ac4ef066a7fb46bd3cf0ec605f0c72d3e4b1
3
+ metadata.gz: d34cbcdaf2713fe8bd44d975d9d9bd40801af014cc84e3e37c69bee8ef14b1b2
4
+ data.tar.gz: 8f82294e16473b2ae75040cd5b1da79c3ddca4d77f103ea86c57a498f004b1d4
5
5
  SHA512:
6
- metadata.gz: 2326979a7350bf881484052c80cba5147f160a923f41b39c80420da5424e9239b62b6758460efeef81198fb83aec4e026a933a503661cf2ced329bb83dbbd12d
7
- data.tar.gz: 07d38ce7613facb15a5e553482cf7b43d05f8b2743c3cac9b26f1fc9ad909cd87e24c03b20fc0258b554a4d9c08fa03123c6f27a36f661d31db054cef52c5221
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decider
4
- VERSION = "0.5.2"
4
+ VERSION = "0.5.3"
5
5
  end
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 |state, event|
79
- context = Evolve.new(state: state, event: event)
80
-
81
- evolutions.find(EVOLVE_FALLBACK) do |args, _|
82
- case args
83
- in [Proc => fn]
84
- context.instance_exec(&fn)
85
- in [etype]
86
- event in ^etype
87
- in [stype, etype]
88
- [state, event] in [^stype, ^etype]
89
- else
90
- false
91
- end
92
- end => [_, handler]
93
-
94
- context.instance_exec(&handler)
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.2
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-12 00:00:00.000000000 Z
10
+ date: 2025-04-15 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby