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