You've already forked Epicnabbo-Catalogus-Updated-Daily
126 lines
2.9 KiB
JavaScript
126 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
const { AigleProxy } = require('aigle-core');
|
|
|
|
const Aigle = require('./aigle');
|
|
const {
|
|
INTERNAL,
|
|
PENDING,
|
|
promiseArrayIterator,
|
|
promiseObjectIterator,
|
|
promiseSetIterator,
|
|
promiseMapIterator,
|
|
iteratorSymbol
|
|
} = require('./internal/util');
|
|
const { execute } = require('./internal/collection');
|
|
|
|
class Series extends AigleProxy {
|
|
constructor(coll) {
|
|
super();
|
|
this._promise = new Aigle(INTERNAL);
|
|
this._index = -1;
|
|
this._coll = undefined;
|
|
this._keys = undefined;
|
|
this._rest = undefined;
|
|
this._result = undefined;
|
|
this._iterate = undefined;
|
|
if (coll === PENDING) {
|
|
this._set = set;
|
|
this._iterate = this._callResolve;
|
|
this._callResolve = execute;
|
|
} else {
|
|
set.call(this, coll);
|
|
}
|
|
}
|
|
|
|
_execute() {
|
|
this._iterate();
|
|
return this._promise;
|
|
}
|
|
|
|
_callResolve(value, key) {
|
|
this._result[key] = value;
|
|
this._iterate();
|
|
}
|
|
|
|
_callResolveMap(value, key) {
|
|
this._result.set(key, value);
|
|
this._iterate();
|
|
}
|
|
|
|
_callReject(reason) {
|
|
this._promise._reject(reason);
|
|
}
|
|
}
|
|
|
|
module.exports = { series, Series };
|
|
|
|
function set(coll) {
|
|
this._coll = coll;
|
|
this._iterate = iterate;
|
|
if (Array.isArray(coll)) {
|
|
const size = coll.length;
|
|
this._rest = size;
|
|
this._result = Array(size);
|
|
this._iterator = promiseArrayIterator;
|
|
} else if (typeof coll !== 'object' || coll === null) {
|
|
this._rest = 0;
|
|
this._result = {};
|
|
} else if (coll[iteratorSymbol]) {
|
|
this._coll = coll[iteratorSymbol]();
|
|
const size = coll.size;
|
|
this._rest = size;
|
|
if (coll instanceof Map) {
|
|
const result = new Map();
|
|
this._result = result;
|
|
this._callResolve = this._callResolveMap;
|
|
this._iterator = promiseMapIterator;
|
|
} else {
|
|
this._result = [];
|
|
this._iterator = promiseSetIterator;
|
|
}
|
|
} else {
|
|
const result = {};
|
|
const keys = Object.keys(coll);
|
|
this._rest = keys.length;
|
|
this._keys = keys;
|
|
this._result = result;
|
|
this._iterator = promiseObjectIterator;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
function iterate() {
|
|
if (++this._index === this._rest) {
|
|
this._promise._resolve(this._result);
|
|
} else {
|
|
this._iterator(this, this._coll, this._index, this._result, this._keys);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* `Aigle.series` functionality has the same functionality as [`Aigle.parallel`](https://suguru03.github.io/aigle/docs/global.html#parallel)
|
|
* and it works in series.
|
|
* @param {Array|Object} collection - it should be an array/object of functions or Promise instances
|
|
* @example
|
|
* Aigle.series([
|
|
* () => Aigle.delay(30, 1),
|
|
* Aigle.delay(20, 2),
|
|
* 3
|
|
* ]).then(array => {
|
|
* console.log(array); // [1, 2, 3]
|
|
* });
|
|
*
|
|
* @example
|
|
* Aigle.series({
|
|
* a: () => Aigle.delay(30, 1),
|
|
* b: Aigle.delay(20, 2),
|
|
* c: 3
|
|
* }).then(obj => {
|
|
* console.log(obj); // { a: 1, b: 2, c: 3 }
|
|
* });
|
|
*/
|
|
function series(collection) {
|
|
return new Series(collection)._execute();
|
|
}
|