class Affect::Fiber::Context

Attributes

handlers[R]

Public Class Methods

new(handlers = nil, &block) click to toggle source
# File lib/affect/fiber.rb, line 66
def initialize(handlers = nil, &block)
  @handlers = handlers || { nil => block || -> { } }
end

Public Instance Methods

call_handler(handler, effect, *args) click to toggle source
# File lib/affect/fiber.rb, line 93
def call_handler(handler, effect, *args)
  if handler.arity == 0
    handler.call
  elsif args.empty?
    handler.call(effect)
  else
    handler.call(*args)
  end
end
capture(&block) click to toggle source
# File lib/affect/fiber.rb, line 103
def capture(&block)
  Affect.capture(block, handler_proc)
end
find_handler(effect) click to toggle source
# File lib/affect/fiber.rb, line 89
def find_handler(effect)
  @handlers[effect] || @handlers[effect.class] || @handlers[nil]
end
handle(effect, *args) click to toggle source
# File lib/affect/fiber.rb, line 76
def handle(effect, *args)
  handler = find_handler(effect)
  if handler
    call_handler(handler, effect, *args)
  else
    begin
      Fiber.yield Intent.new(effect, *args)
    rescue FiberError
      raise RuntimeError, "No handler found for #{effect.inspect}"
    end
  end
end
handler_proc() click to toggle source
# File lib/affect/fiber.rb, line 72
def handler_proc
  proc { |effect, *args| handle(effect, *args) }
end