class FiberRecycling::RecycledFiber

Public Class Methods

new() click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 8
def initialize
  @native_fiber = ::Fiber.new { execution_loop }
  @state = :initialized
  start
end
yield(*args) click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 4
def self.yield(*args)
  ::Fiber.yield(*args)
end

Public Instance Methods

close() click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 14
def close
  raise 'can not close, currently running a block' unless @state == :waiting_for_instruction
  @native_fiber.resume(:close)
  nil
end
execution_loop() click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 28
def execution_loop
  last_reutrn_value = nil
  loop do
    @state = :waiting_for_instruction
    instruction = ::Fiber.yield(last_reutrn_value)
    case instruction
    when :run
      @state = :executing_block
      args = ::Fiber.yield
      proc = ::Fiber.yield
      last_reutrn_value = proc.call(*args)
    when :close
      @state = :closed
      break
    else
      raise 'invalid instruction'
    end
  end
end
resume(*args) click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 48
def resume(*args)
  raise 'can not resume, not running a block' unless @state == :executing_block
  @native_fiber.resume(*args)
end
run(*args, &block) click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 20
def run(*args, &block)
  raise 'can not run, already running a block' unless @state == :waiting_for_instruction
  @native_fiber.resume(:run)
  @native_fiber.resume(args)
  block_reutrn_value = @native_fiber.resume(block)
  block_reutrn_value
end
transfer(*args) click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 53
def transfer(*args)
  raise 'can not transfer, not running a block' unless @state == :executing_block
  @native_fiber.transfer(*args)
end

Private Instance Methods

start() click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 60
def start
  @native_fiber.resume
  nil
end