summaryrefslogtreecommitdiff
path: root/build-es/internal/eachOfLimit.js
diff options
context:
space:
mode:
Diffstat (limited to 'build-es/internal/eachOfLimit.js')
-rw-r--r--build-es/internal/eachOfLimit.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/build-es/internal/eachOfLimit.js b/build-es/internal/eachOfLimit.js
new file mode 100644
index 0000000..5235278
--- /dev/null
+++ b/build-es/internal/eachOfLimit.js
@@ -0,0 +1,49 @@
+'use strict';
+
+import noop from 'lodash-es/noop';
+import once from 'lodash-es/once';
+
+import keyIterator from './keyIterator';
+import onlyOnce from './onlyOnce';
+
+export default function _eachOfLimit(limit) {
+ return function (obj, iterator, callback) {
+ callback = once(callback || noop);
+ obj = obj || [];
+ var nextKey = keyIterator(obj);
+ if (limit <= 0) {
+ return callback(null);
+ }
+ var done = false;
+ var running = 0;
+ var errored = false;
+
+ (function replenish () {
+ if (done && running <= 0) {
+ return callback(null);
+ }
+
+ while (running < limit && !errored) {
+ var key = nextKey();
+ if (key === null) {
+ done = true;
+ if (running <= 0) {
+ callback(null);
+ }
+ return;
+ }
+ running += 1;
+ iterator(obj[key], key, onlyOnce(function (err) {
+ running -= 1;
+ if (err) {
+ callback(err);
+ errored = true;
+ }
+ else {
+ replenish();
+ }
+ }));
+ }
+ })();
+ };
+}