You've already forked Epicnabbo-Catalogus-Updated-Daily
112 lines
2.5 KiB
JavaScript
112 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
const { AigleProxy } = require('aigle-core');
|
|
|
|
const Aigle = require('./aigle');
|
|
const { INTERNAL, call1, apply, callProxyReciever } = require('./internal/util');
|
|
|
|
class Join extends AigleProxy {
|
|
constructor(handler, size) {
|
|
super();
|
|
this._promise = new Aigle(INTERNAL);
|
|
this._rest = size;
|
|
this._result = Array(size);
|
|
this._handler = handler;
|
|
}
|
|
|
|
_callResolve(value, index) {
|
|
if (index === INTERNAL) {
|
|
return this._promise._resolve(value);
|
|
}
|
|
this._result[index] = value;
|
|
if (--this._rest !== 0) {
|
|
return;
|
|
}
|
|
const { _handler, _result } = this;
|
|
if (_handler === undefined) {
|
|
this._promise._resolve(_result);
|
|
} else {
|
|
callProxyReciever(apply(_handler, _result), this, INTERNAL);
|
|
}
|
|
}
|
|
|
|
_callReject(reason) {
|
|
this._promise._reject(reason);
|
|
}
|
|
}
|
|
|
|
class Spread extends AigleProxy {
|
|
constructor(handler) {
|
|
super();
|
|
this._promise = new Aigle(INTERNAL);
|
|
this._handler = handler;
|
|
}
|
|
|
|
_callResolve(value, index) {
|
|
if (index === INTERNAL) {
|
|
return this._promise._resolve(value);
|
|
}
|
|
spread(this, value);
|
|
}
|
|
|
|
_callReject(reason) {
|
|
this._promise._reject(reason);
|
|
}
|
|
}
|
|
|
|
module.exports = { join, Spread };
|
|
|
|
/**
|
|
* @example
|
|
* const p1 = Aigle.delay(20).then(() => 1);
|
|
* const p2 = Aigle.delay(10).then(() => 2);
|
|
* Aigle.join(p1, p2, (v1, v2) => {
|
|
* console.log(v1, v2); // 1 2
|
|
* });
|
|
*/
|
|
function join() {
|
|
let l = arguments.length;
|
|
const handler = typeof arguments[l - 1] === 'function' ? arguments[--l] : undefined;
|
|
const receiver = new Join(handler, l);
|
|
while (l--) {
|
|
callProxyReciever(arguments[l], receiver, l);
|
|
}
|
|
return receiver._promise;
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @param {AigleProxy} proxy
|
|
* @param {string|Array|Object} array
|
|
*/
|
|
function spread(proxy, array) {
|
|
const { _handler } = proxy;
|
|
if (_handler === undefined) {
|
|
return proxy._promise._resolve(array);
|
|
}
|
|
switch (typeof array) {
|
|
case 'string':
|
|
array = array.split('');
|
|
break;
|
|
case 'object':
|
|
if (Array.isArray(array)) {
|
|
break;
|
|
}
|
|
if (array) {
|
|
const keys = Object.keys(array);
|
|
let l = keys.length;
|
|
const arr = Array(l);
|
|
while (l--) {
|
|
arr[l] = array[keys[l]];
|
|
}
|
|
array = arr;
|
|
break;
|
|
}
|
|
/* eslint no-fallthrough: 0 */
|
|
default:
|
|
/* eslint no-fallthrough: 1 */
|
|
return callProxyReciever(call1(_handler, array), proxy, INTERNAL);
|
|
}
|
|
callProxyReciever(apply(_handler, array), proxy, INTERNAL);
|
|
}
|