class Concurrent::Edge::ZipPromise

@!visibility private

Public Class Methods

new(blocked_by_futures, default_executor) click to toggle source
Calls superclass method Concurrent::Edge::BlockedPromise.new
# File lib/concurrent/edge/future.rb, line 1263
def initialize(blocked_by_futures, default_executor)
  klass = Event
  blocked_by_futures.each do |f|
    if f.is_a?(Future)
      if klass == Event
        klass = Future
        break
      end
    end
  end

  # noinspection RubyArgCount
  super(klass.new(self, default_executor), blocked_by_futures, blocked_by_futures.size)

  if blocked_by_futures.empty?
    on_completable nil
  end
end

Private Instance Methods

on_completable(done_future) click to toggle source
# File lib/concurrent/edge/future.rb, line 1282
def on_completable(done_future)
  all_success = true
  values      = []
  reasons     = []

  blocked_by.each do |future|
    next unless future.is_a?(Future)
    success, value, reason = future.result

    unless success
      all_success = false
    end

    values << value
    reasons << reason
  end

  if all_success
    if values.empty?
      complete_with Event::COMPLETED
    else
      if values.size == 1
        complete_with Future::Success.new(values.first)
      else
        complete_with Future::SuccessArray.new(values)
      end
    end
  else
    complete_with Future::PartiallyFailed.new(values, reasons)
  end
end