Sha256: e0dea4c7737c9fbb008552959d34facb1f5d477422161c6bb41a8808853e3d3d

Contents?: true

Size: 1.51 KB

Versions: 7

Compression:

Stored size: 1.51 KB

Contents

require "eventmachine"

module When
  class Promise
    def initialize(deferred = EM::DefaultDeferrable.new)
      @deferred = deferred
    end

    def callback(&block)
      @deferred.callback(&block)
      self
    end

    def errback(&block)
      @deferred.errback(&block)
      self
    end
  end

  class Resolver
    def initialize(deferred = EM::DefaultDeferrable.new)
      @deferred = deferred
      @resolved = false
    end

    def resolve(*args)
      mark_resolved
      @deferred.succeed(*args)
    end

    def reject(*args)
      mark_resolved
      @deferred.fail(*args)
    end

    private
    def mark_resolved
      raise StandardError.new("Already resolved") if @resolved
      @resolved = true
    end
  end

  class Deferred
    attr_reader :resolver, :promise

    def initialize
      deferred = EM::DefaultDeferrable.new
      @resolver = Resolver.new(deferred)
      @promise = Promise.new(deferred)
    end

    def resolve(*args)
      @resolver.resolve(*args)
    end

    def reject(*args)
      @resolver.reject(*args)
    end

    def callback(&block)
      @promise.callback(&block)
    end

    def errback(&block)
      @promise.errback(&block)
    end

    def self.resolved(value)
      d = self.new
      d.resolve(vaule)
      d
    end

    def self.rejected(value)
      d = self.new
      d.reject(vaule)
      d
    end
  end

  module Functions
    def deferred(val)
      return val if val.respond_to?(:callback) && val.respond_to?(:errback)
      Deferred.resolved(val).promise
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
dolt-0.3.1 ./lib/dolt/async/when.rb
dolt-0.3.0 ./lib/dolt/async/when.rb
dolt-0.2.2 ./lib/dolt/async/when.rb
dolt-0.2.1 ./lib/dolt/async/when.rb
dolt-0.2.0 ./lib/dolt/async/when.rb
dolt-0.1.1 ./lib/dolt/async/when.rb
dolt-0.1.0 ./lib/dolt/async/when.rb