Sha256: 83685ef47d003e661ae30e2877c12ec2237f92c1608a8b179b2e17411cf1e062

Contents?: true

Size: 998 Bytes

Versions: 2

Compression:

Stored size: 998 Bytes

Contents

module LightIO::Core
  # 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)
  class Future
    def initialize
      @value = nil
      @ioloop = IOloop.current
      @state = :init
    end

    def done?
      @state == :done
    end

    # Transfer and set result value
    #
    # use this method to set back result
    def transfer(value=nil)
      raise Error, "state error" if done?
      @value = value
      done!
      @light_fiber.transfer if @light_fiber
    end

    # Get value
    #
    # this method will block current beam/fiber, until future result is set.
    def value
      return @value if done?
      raise Error, 'already used' if @light_fiber
      @light_fiber = LightFiber.current
      @ioloop.transfer
      @value
    end

    private

    def done!
      @state = :done
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lightio-0.1.1 lib/lightio/core/future.rb
lightio-0.1.0 lib/lightio/core/future.rb