import noop from 'lodash/noop'; import once from './once'; import iterator from './iterator'; import onlyOnce from './onlyOnce'; export default function _eachOfLimit(limit) { return function (obj, iteratee, callback) { callback = once(callback || noop); if (limit <= 0 || !obj) { return callback(null); } var nextElem = iterator(obj); var done = false; var running = 0; function iterateeCallback(err) { running -= 1; if (err) { done = true; callback(err); } else if (done && running <= 0) { return callback(null); } else { replenish(); } } function replenish () { while (running < limit && !done) { var elem = nextElem(); if (elem === null) { done = true; if (running <= 0) { callback(null); } return; } running += 1; iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); } } replenish(); }; }