'use strict'; const { Parallel } = require('./parallel'); class AllSettled extends Parallel { _set(coll) { this._errorSet = new Set(); this._promise._resolve = createResolve(this); super._set(coll); } _callReject(reason, key) { this._errorSet.add(key); this._callResolve(reason, key); return true; } } function createResolve(proxy) { const { _errorSet, _promise } = proxy; const { _resolve } = _promise; return result => { if (Array.isArray(result)) { result = result.map(iterator); } else if (result instanceof Map) { const map = result; result = map; map.forEach((val, key) => result.set(key, iterator(val, key))); } else { Object.entries(result).forEach(([key, val]) => (result[key] = iterator(val, key))); } _resolve.call(_promise, result); }; function iterator(res, key) { return _errorSet.has(key) ? { state: 'rejected', reason: res } : { state: 'fulfilled', value: res }; } } module.exports = { allSettled, AllSettled }; /** * Return an Aigle instance * @param {Array|Object} collection - it should be an array/object of functions or Promise instances * @example * Aigle.allSettled([ * Aigle.resolve(1), * Aigle.reject(2), * Aigle.reject(3) * ]) * .then(array => { * console.log(array); // [{ state: 'fulfilled', value: 1 }, { state: 'rejected', reason: 2 }, { state: 'rejected', reason: 3 }] * }); */ function allSettled(collection) { return new AllSettled(collection)._promise; }