Demo for query storing
Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/p-map/index.js b/node_modules/p-map/index.js
new file mode 100644
index 0000000..f91477e
--- /dev/null
+++ b/node_modules/p-map/index.js
@@ -0,0 +1,67 @@
+'use strict';
+module.exports = (iterable, mapper, opts) => new Promise((resolve, reject) => {
+ opts = Object.assign({
+ concurrency: Infinity
+ }, opts);
+
+ if (typeof mapper !== 'function') {
+ throw new TypeError('Mapper function is required');
+ }
+
+ const concurrency = opts.concurrency;
+
+ if (!(typeof concurrency === 'number' && concurrency >= 1)) {
+ throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`);
+ }
+
+ const ret = [];
+ const iterator = iterable[Symbol.iterator]();
+ let isRejected = false;
+ let iterableDone = false;
+ let resolvingCount = 0;
+ let currentIdx = 0;
+
+ const next = () => {
+ if (isRejected) {
+ return;
+ }
+
+ const nextItem = iterator.next();
+ const i = currentIdx;
+ currentIdx++;
+
+ if (nextItem.done) {
+ iterableDone = true;
+
+ if (resolvingCount === 0) {
+ resolve(ret);
+ }
+
+ return;
+ }
+
+ resolvingCount++;
+
+ Promise.resolve(nextItem.value)
+ .then(el => mapper(el, i))
+ .then(
+ val => {
+ ret[i] = val;
+ resolvingCount--;
+ next();
+ },
+ err => {
+ isRejected = true;
+ reject(err);
+ }
+ );
+ };
+
+ for (let i = 0; i < concurrency; i++) {
+ next();
+
+ if (iterableDone) {
+ break;
+ }
+ }
+});