class Dry::Effects::Effects::State

Public Class Methods

new(scope, default: Undefined, writer: true, as: scope) click to toggle source
Calls superclass method
# File lib/dry/effects/effects/state.rb, line 24
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