'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = asyncEachOfLimit; var _breakLoop = require('./breakLoop.js'); var _breakLoop2 = _interopRequireDefault(_breakLoop); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // for async generators function asyncEachOfLimit(generator, limit, iteratee, callback) { let done = false; let canceled = false; let awaiting = false; let running = 0; let idx = 0; function replenish() { //console.log('replenish') if (running >= limit || awaiting || done) return; //console.log('replenish awaiting') awaiting = true; generator.next().then(({ value, done: iterDone }) => { //console.log('got value', value) if (canceled || done) return; awaiting = false; if (iterDone) { done = true; if (running <= 0) { //console.log('done nextCb') callback(null); } return; } running++; iteratee(value, idx, iterateeCallback); idx++; replenish(); }).catch(handleError); } function iterateeCallback(err, result) { //console.log('iterateeCallback') running -= 1; if (canceled) return; if (err) return handleError(err); if (err === false) { done = true; canceled = true; return; } if (result === _breakLoop2.default || done && running <= 0) { done = true; //console.log('done iterCb') return callback(null); } replenish(); } function handleError(err) { if (canceled) return; awaiting = false; done = true; callback(err); } replenish(); } module.exports = exports.default;