summaryrefslogtreecommitdiffstats
path: root/node_modules/mongoose/lib/helpers/parallelLimit.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/mongoose/lib/helpers/parallelLimit.js')
-rw-r--r--node_modules/mongoose/lib/helpers/parallelLimit.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/mongoose/lib/helpers/parallelLimit.js b/node_modules/mongoose/lib/helpers/parallelLimit.js
new file mode 100644
index 0000000..9b07c02
--- /dev/null
+++ b/node_modules/mongoose/lib/helpers/parallelLimit.js
@@ -0,0 +1,55 @@
+'use strict';
+
+module.exports = parallelLimit;
+
+/*!
+ * ignore
+ */
+
+function parallelLimit(fns, limit, callback) {
+ let numInProgress = 0;
+ let numFinished = 0;
+ let error = null;
+
+ if (limit <= 0) {
+ throw new Error('Limit must be positive');
+ }
+
+ if (fns.length === 0) {
+ return callback(null, []);
+ }
+
+ for (let i = 0; i < fns.length && i < limit; ++i) {
+ _start();
+ }
+
+ function _start() {
+ fns[numFinished + numInProgress](_done(numFinished + numInProgress));
+ ++numInProgress;
+ }
+
+ const results = [];
+
+ function _done(index) {
+ return (err, res) => {
+ --numInProgress;
+ ++numFinished;
+
+ if (error != null) {
+ return;
+ }
+ if (err != null) {
+ error = err;
+ return callback(error);
+ }
+
+ results[index] = res;
+
+ if (numFinished === fns.length) {
+ return callback(null, results);
+ } else if (numFinished + numInProgress < fns.length) {
+ _start();
+ }
+ };
+ }
+}