Sha256: 7c0c342c49aae9fd7d64746391a2ca21243543d308a944127474a01bb865b284

Contents?: true

Size: 803 Bytes

Versions: 1

Compression:

Stored size: 803 Bytes

Contents

require "thread"
require "monitor"

class FutureResource
  def initialize
    @resource_lock          = Monitor.new
    @resource_value_blocker = @resource_lock.new_cond
  end

  def set_yet?
    !!@resource_lock.synchronize { defined? @resource }
  end

  def resource
    @resource_lock.synchronize do
      @resource_value_blocker.wait unless defined? @resource
      @resource
    end
  end

  def resource=(resource)
    @resource_lock.synchronize do
      raise ResourceAlreadySetException if defined? @resource
      @resource = resource
      @resource_value_blocker.broadcast
      @resource_value_blocker = nil # Don't really need it anymore.
    end
  end

  class ResourceAlreadySetException < StandardError
    def initialize
      super "Cannot set this resource twice!"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
future-resource-0.0.1 lib/future-resource.rb