Class: Dry::Effects::Effects::State

Inherits:
Module
  • Object
show all
Defined in:
lib/dry/effects/effects/state.rb

Direct Known Subclasses

Reader

Defined Under Namespace

Classes: State

Instance Method Summary collapse

Constructor Details

#initialize(scope, default: Undefined, writer: true, as: scope) ⇒ State

Returns a new instance of State.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/dry/effects/effects/state.rb', line 13

def initialize(scope, default: Undefined, writer: true, as: scope)
  super()

  read = State.new(type: :state, name: :read, scope: scope)
  write = State.new(type: :state, name: :write, scope: scope)

  module_eval do
    if Undefined.equal?(default)
      define_method(as) do |&block|
        if block
          Undefined.default(::Dry::Effects.yield(read) { Undefined }, &block)
        else
          value = ::Dry::Effects.yield(read) { raise Errors::MissingStateError, read }

          Undefined.default(value) { raise Errors::UndefinedStateError, read }
        end
      end
    else
      define_method(as) do |&block|
        if block
          Undefined.default(::Dry::Effects.yield(read) { Undefined }, &block)
        else
          Undefined.default(::Dry::Effects.yield(read) { Undefined }, default)
        end
      end
    end

    if writer
      define_method(:"#{as}=") do |value|
        ::Dry::Effects.yield(write.(value: value))
      end
    end
  end
end