Sha256: c86502f89afb86f26f1912a4dfcca9ddfe966e341513dd454a9b78962bb0b776

Contents?: true

Size: 1003 Bytes

Versions: 3

Compression:

Stored size: 1003 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.is_a?(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

3 entries across 3 versions & 1 rubygems

Version Path
promise.rb-0.7.1 lib/promise/group.rb
promise.rb-0.7.0 lib/promise/group.rb
promise.rb-0.7.0.rc2 lib/promise/group.rb