module Affect::Fiber

Public Instance Methods

capture(*args, &block) click to toggle source
# File lib/affect/fiber.rb, line 28
def capture(*args, &block)
  block, handler = case args.size
    when 1 then block ? [block, args.first] : [args.first, nil]
    when 2 then args
    else [block, nil]
  end

  f = Fiber.new(&block)
  v = f.resume
  loop do
    break v unless f.alive? && v.is_a?(Intent)

    if v.is_a?(Escape)
      break v.()
    else
      v = f.resume(handler.(*v.args))
    end
  end
end
escape(value = nil, &block) click to toggle source
# File lib/affect/fiber.rb, line 54
def escape(value = nil, &block)
  block ||= proc { value }
  Fiber.yield Escape.new(&block)
rescue FiberError
  raise RuntimeError, 'escape called outside of capture'
end
method_missing(*args) click to toggle source
# File lib/affect/fiber.rb, line 61
def method_missing(*args)
  perform(*args)
end
perform(*args) click to toggle source
# File lib/affect/fiber.rb, line 48
def perform(*args)
  Fiber.yield Intent.new(*args)
rescue FiberError
  raise RuntimeError, 'perform called outside of capture'
end