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.
-
promises: an array of promises
-
opts: options for
MrDarcy.promise
# 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
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