Module: Decider::View

Defined in:
lib/decider/view.rb

Defined Under Namespace

Classes: Module

Constant Summary collapse

StateAlreadyDefined =
Class.new(StandardError)
StateNotDefined =
Class.new(StandardError)

Class Method Summary collapse

Class Method Details

.define(&block) ⇒ Object



122
123
124
125
# File 'lib/decider/view.rb', line 122

def self.define(&block)
  builder = Builder.new
  builder.build(&block)
end

.dimap_on_state(fl, fr, view) ⇒ Object



145
146
147
148
149
150
151
152
153
# File 'lib/decider/view.rb', line 145

def self.dimap_on_state(fl, fr, view)
  define do
    initial_state fr.call(view.initial_state)

    evolve proc { true } do
      fr.call(view.evolve(fl.call(state), event))
    end
  end
end

.lmap_on_event(fn, view) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/decider/view.rb', line 127

def self.lmap_on_event(fn, view)
  define do
    initial_state view.initial_state

    evolve proc { true } do
      view.evolve(state, fn.call(event))
    end
  end
end

.lmap_on_state(fn, view) ⇒ Object



137
138
139
# File 'lib/decider/view.rb', line 137

def self.lmap_on_state(fn, view)
  dimap_on_state(fn, ->(state) { state }, view)
end

.many(view) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/decider/view.rb', line 155

def self.many(view)
  define do
    initial_state({})

    evolve proc { [state, event] in [Hash, [_id, _]] } do
      event => [id, event]

      vs = state.fetch(id) { view.initial_state }
      vs = view.evolve(vs, event)

      state.merge(id => vs)
    end
  end
end

.rmap_on_state(fn, view) ⇒ Object



141
142
143
# File 'lib/decider/view.rb', line 141

def self.rmap_on_state(fn, view)
  dimap_on_state(->(state) { state }, fn, view)
end