class Warg::Executor::Deferred::CallbacksQueue

Public Class Methods

new(execution_order) click to toggle source
# File lib/warg.rb, line 1663
def initialize(execution_order)
  @queue = []
  @executor_class = Executor.for(execution_order)
end

Public Instance Methods

<<(callback) click to toggle source
# File lib/warg.rb, line 1668
def <<(callback)
  @queue << callback
end
drain(execution_result) click to toggle source
# File lib/warg.rb, line 1672
def drain(execution_result)
  drain_queue = @queue.dup

  # NOTE: It would be nice to incorporate the failure callback into the code here
  until drain_queue.empty? || execution_result.failed?
    callback = drain_queue.shift
    executor = @executor_class.new(execution_result)

    execution_result = executor.run do |outcome, result|
      callback_outcome = Outcome.new(outcome)

      begin
        # Use `||=` in case `#value` is set in the callback
        callback_outcome.value ||= callback.(outcome.host, outcome.value, callback_outcome)
      rescue => error
        callback_outcome.error = error
      end

      result.update callback_outcome
    end
  end

  execution_result
end