UNPKG

promisu

Version:

functional promise with map filter reduce scan all race every some few try waitfor finally queue debounce throttle

64 lines (50 loc) 1.4 kB
const PromisuFew = (iterable, options) => new Promise((resolve, reject) => { const opts = Object.assign({ count: 1 }, options) if (!Number.isFinite(opts.count)) { throw new TypeError('Expect a finite number for options.count') } const values = [] const errors = [] let elementCount = 0 let maxErrorCount = (-opts.count) + 1 let maxFilteredCount = (-opts.count) + 1 let done = false const fulfilled = value => { if (done) { return } if (typeof opts.filter === 'function' && !opts.filter(value)) { if (--maxFilteredCount === 0) { done = true reject(new Error('Not enough values passed filter option')) } return } values.push(value) if (--opts.count === 0) { done = true resolve(values) } } const rejected = error => { if (done) { return } errors.push(error) if (--maxErrorCount === 0) { done = true const errorString = errors.map(err => err.message || err.name).join(';') reject(new Error(errorString)) } } for (const element of iterable) { maxErrorCount++ maxFilteredCount++ elementCount++ Promise.resolve(element).then(fulfilled, rejected) } if (opts.count > elementCount) { throw new Error(`Expect input to contain >= ${opts.count} items, but only ${elementCount} items`) } }) module.exports = PromisuFew