dashp
Version:
Utilities for monadic promises.
72 lines (64 loc) • 1.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.collect8 = exports.collect7 = exports.collect6 = exports.collect5 = exports.collect4 = exports.collect3 = exports.collect2 = exports.collect = void 0;
var _curry = require("./internal/curry");
const collectN = atOnce => (f, xs) => // eslint-disable-next-line promise/avoid-new
new Promise((resolve, reject) => {
const ret = [];
const iterator = xs[Symbol.iterator]();
let isRejected = false;
let iterableDone = false;
let resolvingCount = 0;
let currentIdx = 0;
const next = () => {
if (isRejected) return;
const nextItem = iterator.next();
const i = currentIdx;
currentIdx += 1;
if (nextItem.done) {
iterableDone = true;
if (resolvingCount === 0) resolve(ret);
return;
}
resolvingCount += 1;
Promise.resolve(nextItem.value).then(f) // eslint-disable-next-line promise/always-return
.then(val => {
ret[i] = val;
resolvingCount -= 1;
next(); // eslint-disable-line promise/no-callback-in-promise
}).catch(err => {
isRejected = true;
reject(err);
});
};
for (let i = 0; i < atOnce; i += 1) {
next();
if (iterableDone) break;
}
});
const {
collect,
collect2,
collect3,
collect4,
collect5,
collect6,
collect7,
collect8
} = [...Array(8).keys()].reduce((memo, i) => {
const name = `collect${i === 0 ? "" : i + 1}`;
return Object.assign(memo, {
[name]: (0, _curry.curry2)(name, collectN(i + 1))
});
}, {});
exports.collect8 = collect8;
exports.collect7 = collect7;
exports.collect6 = collect6;
exports.collect5 = collect5;
exports.collect4 = collect4;
exports.collect3 = collect3;
exports.collect2 = collect2;
exports.collect = collect;
//# sourceMappingURL=collect.js.map