Sha256: b8cfbf9615cec2af133e7f0b206292ce8338858177cbe9ebddc08cff2f7b29e6

Contents?: true

Size: 1010 Bytes

Versions: 1

Compression:

Stored size: 1010 Bytes

Contents

class Promise
  class Group
    attr_reader :promise

    def initialize(result_promise, inputs)
      @promise = result_promise
      @inputs = inputs
      @remaining = count_promises
      if @remaining.zero?
        promise.fulfill(inputs)
      else
        chain_inputs
      end
    end

    private

    def chain_inputs
      on_fulfill = method(:on_fulfill)
      on_reject = promise.method(:reject)
      each_promise do |input_promise|
        input_promise.then(on_fulfill, on_reject)
      end
    end

    def on_fulfill(_result)
      @remaining -= 1
      if @remaining.zero?
        result = @inputs.map { |obj| promise?(obj) ? obj.value : obj }
        promise.fulfill(result)
      end
    end

    def promise?(obj)
      obj.instance_of?(Promise)
    end

    def count_promises
      count = 0
      each_promise { count += 1 }
      count
    end

    def each_promise
      @inputs.each do |obj|
        yield obj if promise?(obj)
      end
    end
  end
  private_constant :Group
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
promise.rb-0.7.0.rc1 lib/promise/group.rb