var Class = require('./Class');
|
var toArr = require('./toArr');
|
var each = require('./each');
|
var map = require('./map');
|
var noop = require('./noop');
|
var some = require('./some');
|
exports = Class({
|
initialize: function Readiness() {
|
this._promises = {};
|
this._resolves = {};
|
this._states = {};
|
},
|
signal: function(tasks) {
|
var states = this._states;
|
each(this._getPromises(toArr(tasks)), function(val) {
|
if (!val.state) {
|
states[val.task] = true;
|
val.resolve();
|
}
|
});
|
},
|
isReady: function(tasks) {
|
return !some(this._getPromises(toArr(tasks)), function(val) {
|
return !val.state;
|
});
|
},
|
ready: function(tasks) {
|
var fn =
|
arguments.length > 1 && arguments[1] !== undefined
|
? arguments[1]
|
: noop;
|
return Promise.all(
|
map(this._getPromises(toArr(tasks)), function(val) {
|
return val.promise;
|
})
|
).then(fn);
|
},
|
_getPromises: function(tasks) {
|
var promises = this._promises;
|
var resolves = this._resolves;
|
var states = this._states;
|
return map(tasks, function(task) {
|
if (!promises[task]) {
|
promises[task] = new Promise(function(resolve) {
|
resolves[task] = resolve;
|
states[task] = false;
|
});
|
}
|
return {
|
task: task,
|
promise: promises[task],
|
resolve: resolves[task],
|
state: states[task]
|
};
|
});
|
}
|
});
|
|
module.exports = exports;
|