class LightIO::Core::Future

Provide a safe way to transfer beam/fiber control flow.

@Example:

future = Future.new
# future#value will block current beam
Beam.new{future.value}
# use transfer to set value
future.transfer(1)

Public Class Methods

new() click to toggle source
# File lib/lightio/core/future.rb, line 11
def initialize
  @value = nil
  @ioloop = IOloop.current
  @state = :init
  @light_fiber = nil
end

Public Instance Methods

done?() click to toggle source
# File lib/lightio/core/future.rb, line 18
def done?
  @state == :done
end
transfer(value=nil) click to toggle source

Transfer and set result value

use this method to set back result

# File lib/lightio/core/future.rb, line 25
def transfer(value=nil)
  raise LightIO::Error, "state error" if done?
  @value = value
  done!
  @light_fiber.transfer if @light_fiber
end
value() click to toggle source

Get value

this method will block current beam/fiber, until future result is set.

# File lib/lightio/core/future.rb, line 39
def value
  return @value if done?
  raise LightIO::Error, 'already used' if @light_fiber
  @light_fiber = LightFiber.current
  @ioloop.transfer
  @value
end
value=(value) click to toggle source
# File lib/lightio/core/future.rb, line 32
def value=(value)
  transfer(value)
end

Private Instance Methods

done!() click to toggle source
# File lib/lightio/core/future.rb, line 49
def done!
  @state = :done
end