class MrDarcy::Promise::Collection

A meta-promise that represents a collection of other promises and their states.

Public Class Methods

new(promises, opts={}) click to toggle source

Creates a meta-promise based on a collection of promises.

# File lib/mr_darcy/promise/collection.rb, line 18
def initialize promises, opts={}
  @lock     = Mutex.new
  @promises = []
  @size     = promises.size
  @promise  = MrDarcy.promise opts do
    promises.each do |p|
      add_promise p
    end
  end
end

Public Instance Methods

<<(promise)
Alias for: push
each(&block) click to toggle source

Allow iteration of promises for Enumerable.

# File lib/mr_darcy/promise/collection.rb, line 36
def each &block
  promises.each &block
end
final() click to toggle source

See MrDarcy::Promise::Base#final

# File lib/mr_darcy/promise/collection.rb, line 30
def final
  my_promise.final
  self
end
promises() click to toggle source

Return an array of promises in this collection.

# File lib/mr_darcy/promise/collection.rb, line 53
def promises
  @lock.synchronize { @promises }
end
push(promise) click to toggle source

Add a new promise to our collection.

# File lib/mr_darcy/promise/collection.rb, line 41
def push promise
  @lock.synchronize { @size = @size + 1 }
  add_promise promise
end
Also aliased as: <<
size() click to toggle source

Return the number of promises in this collection.

# File lib/mr_darcy/promise/collection.rb, line 48
def size
  @lock.synchronize { @size }
end

Private Instance Methods

add_promise(promise) click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 59
def add_promise promise
  ::Kernel.raise RuntimeError, "Collection already resolved" if my_promise && resolved?
  ::Kernel.raise RuntimeError, "Collection already rejected" if my_promise && rejected?
  ::Kernel.raise ArgumentError, "must be thenable" unless promise.respond_to?(:then) && promise.respond_to?(:fail)
  @lock.synchronize { @promises.push promise }
  set_up_promise promise
end
all_promises_present?() click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 95
def all_promises_present?
  @promises.size == @size
end
all_promises_resolved?() click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 99
def all_promises_resolved?
  @promises.all?(&:resolved?)
end
can_resolve?() click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 91
def can_resolve?
  all_promises_present? && all_promises_resolved? && @promise.unresolved?
end
my_promise() click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 67
def my_promise
  @lock.synchronize { @promise }
end
record_reject(value) click to toggle source

/NOT THREADSAFE

# File lib/mr_darcy/promise/collection.rb, line 104
def record_reject value
  my_promise.reject value
  value
end
record_resolve(value) click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 77
def record_resolve value
  @lock.synchronize do
    resolve_promise if can_resolve?
    value
  end
end
resolve_promise() click to toggle source

NOT THREADSAFE:

because they're called from within #record_resolve
which locks.
# File lib/mr_darcy/promise/collection.rb, line 87
def resolve_promise
  @promise.resolve @promises.map(&:result)
end
set_up_promise(promise) click to toggle source
# File lib/mr_darcy/promise/collection.rb, line 71
def set_up_promise promise
  promise.then(&method(:record_resolve))
  promise.fail(&method(:record_reject))
  # promise.then { |v| record_resolve v }.fail { |v| record_reject v }
end