summaryrefslogtreecommitdiff
path: root/node_modules/pend
diff options
context:
space:
mode:
authorArman Shah <[email protected]>2018-02-19 23:50:04 -0800
committerArman Shah <[email protected]>2018-02-19 23:50:04 -0800
commitae34dcfd3823a609ba7182f2d6eda593be876f7d (patch)
treeb9d7f2884c4999349418cbdc4f9ab46d113e0afd /node_modules/pend
parentInitial commit (diff)
downloadlauncher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.tar.xz
launcher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.zip
add base files
Diffstat (limited to 'node_modules/pend')
-rw-r--r--node_modules/pend/LICENSE23
-rw-r--r--node_modules/pend/README.md41
-rw-r--r--node_modules/pend/index.js55
-rw-r--r--node_modules/pend/package.json47
-rw-r--r--node_modules/pend/test.js137
5 files changed, 303 insertions, 0 deletions
diff --git a/node_modules/pend/LICENSE b/node_modules/pend/LICENSE
new file mode 100644
index 0000000..0bbb53e
--- /dev/null
+++ b/node_modules/pend/LICENSE
@@ -0,0 +1,23 @@
+The MIT License (Expat)
+
+Copyright (c) 2014 Andrew Kelley
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/pend/README.md b/node_modules/pend/README.md
new file mode 100644
index 0000000..bb40a07
--- /dev/null
+++ b/node_modules/pend/README.md
@@ -0,0 +1,41 @@
+# Pend
+
+Dead-simple optimistic async helper.
+
+## Usage
+
+```js
+var Pend = require('pend');
+var pend = new Pend();
+pend.max = 10; // defaults to Infinity
+setTimeout(pend.hold(), 1000); // pend.wait will have to wait for this hold to finish
+pend.go(function(cb) {
+ console.log("this function is immediately executed");
+ setTimeout(function() {
+ console.log("calling cb 1");
+ cb();
+ }, 500);
+});
+pend.go(function(cb) {
+ console.log("this function is also immediately executed");
+ setTimeout(function() {
+ console.log("calling cb 2");
+ cb();
+ }, 1000);
+});
+pend.wait(function(err) {
+ console.log("this is excuted when the first 2 have returned.");
+ console.log("err is a possible error in the standard callback style.");
+});
+```
+
+Output:
+
+```
+this function is immediately executed
+this function is also immediately executed
+calling cb 1
+calling cb 2
+this is excuted when the first 2 have returned.
+err is a possible error in the standard callback style.
+```
diff --git a/node_modules/pend/index.js b/node_modules/pend/index.js
new file mode 100644
index 0000000..3bf485e
--- /dev/null
+++ b/node_modules/pend/index.js
@@ -0,0 +1,55 @@
+module.exports = Pend;
+
+function Pend() {
+ this.pending = 0;
+ this.max = Infinity;
+ this.listeners = [];
+ this.waiting = [];
+ this.error = null;
+}
+
+Pend.prototype.go = function(fn) {
+ if (this.pending < this.max) {
+ pendGo(this, fn);
+ } else {
+ this.waiting.push(fn);
+ }
+};
+
+Pend.prototype.wait = function(cb) {
+ if (this.pending === 0) {
+ cb(this.error);
+ } else {
+ this.listeners.push(cb);
+ }
+};
+
+Pend.prototype.hold = function() {
+ return pendHold(this);
+};
+
+function pendHold(self) {
+ self.pending += 1;
+ var called = false;
+ return onCb;
+ function onCb(err) {
+ if (called) throw new Error("callback called twice");
+ called = true;
+ self.error = self.error || err;
+ self.pending -= 1;
+ if (self.waiting.length > 0 && self.pending < self.max) {
+ pendGo(self, self.waiting.shift());
+ } else if (self.pending === 0) {
+ var listeners = self.listeners;
+ self.listeners = [];
+ listeners.forEach(cbListener);
+ }
+ }
+ function cbListener(listener) {
+ listener(self.error);
+ }
+}
+
+function pendGo(self, fn) {
+ fn(pendHold(self));
+}
diff --git a/node_modules/pend/package.json b/node_modules/pend/package.json
new file mode 100644
index 0000000..ffd63a7
--- /dev/null
+++ b/node_modules/pend/package.json
@@ -0,0 +1,47 @@
+{
+ "_from": "pend@~1.2.0",
+ "_id": "[email protected]",
+ "_inBundle": false,
+ "_integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "_location": "/pend",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "pend@~1.2.0",
+ "name": "pend",
+ "escapedName": "pend",
+ "rawSpec": "~1.2.0",
+ "saveSpec": null,
+ "fetchSpec": "~1.2.0"
+ },
+ "_requiredBy": [
+ "/fd-slicer"
+ ],
+ "_resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "_shasum": "7a57eb550a6783f9115331fcf4663d5c8e007a50",
+ "_spec": "pend@~1.2.0",
+ "_where": "/Users/armanshah/Desktop/node-projects/shopping-list/node_modules/fd-slicer",
+ "author": {
+ "name": "Andrew Kelley",
+ "email": "[email protected]"
+ },
+ "bugs": {
+ "url": "https://github.com/andrewrk/node-pend/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "dead-simple optimistic async helper",
+ "homepage": "https://github.com/andrewrk/node-pend#readme",
+ "license": "MIT",
+ "main": "index.js",
+ "name": "pend",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/andrewrk/node-pend.git"
+ },
+ "scripts": {
+ "test": "node test.js"
+ },
+ "version": "1.2.0"
+}
diff --git a/node_modules/pend/test.js b/node_modules/pend/test.js
new file mode 100644
index 0000000..75c0f2a
--- /dev/null
+++ b/node_modules/pend/test.js
@@ -0,0 +1,137 @@
+var assert = require('assert');
+var Pend = require('./');
+
+var tests = [
+ {
+ name: "basic",
+ fn: testBasic,
+ },
+ {
+ name: "max",
+ fn: testWithMax,
+ },
+ {
+ name: "callback twice",
+ fn: testCallbackTwice,
+ },
+ {
+ name: "calling wait twice",
+ fn: testCallingWaitTwice,
+ },
+ {
+ name: "hold()",
+ fn: testHoldFn,
+ },
+];
+var testCount = tests.length;
+
+doOneTest();
+
+function doOneTest() {
+ var test = tests.shift();
+ if (!test) {
+ console.log(testCount + " tests passed.");
+ return;
+ }
+ process.stdout.write(test.name + "...");
+ test.fn(function() {
+ process.stdout.write("OK\n");
+ doOneTest();
+ });
+}
+
+function testBasic(cb) {
+ var pend = new Pend();
+ var results = [];
+ pend.go(function(cb) {
+ results.push(1);
+ setTimeout(function() {
+ results.push(3);
+ cb();
+ }, 500);
+ });
+ pend.go(function(cb) {
+ results.push(2);
+ setTimeout(function() {
+ results.push(4);
+ cb();
+ }, 1000);
+ });
+ pend.wait(function(err) {
+ assert.deepEqual(results, [1,2,3,4]);
+ cb();
+ });
+ assert.deepEqual(results, [1, 2]);
+}
+
+function testWithMax(cb) {
+ var pend = new Pend();
+ var results = [];
+ pend.max = 2;
+ pend.go(function(cb) {
+ results.push('a');
+ setTimeout(function() {
+ results.push(1);
+ cb();
+ }, 500);
+ });
+ pend.go(function(cb) {
+ results.push('b');
+ setTimeout(function() {
+ results.push(1);
+ cb();
+ }, 500);
+ });
+ pend.go(function(cb) {
+ results.push('c');
+ setTimeout(function() {
+ results.push(2);
+ cb();
+ }, 100);
+ });
+ pend.wait(function(err) {
+ assert.deepEqual(results, ['a', 'b', 1, 'c', 1, 2]);
+ cb();
+ });
+ assert.deepEqual(results, ['a', 'b']);
+}
+
+function testCallbackTwice(cb) {
+ var pend = new Pend();
+ pend.go(function(cb) {
+ setTimeout(cb, 100);
+ });
+ pend.go(function(cb) {
+ cb();
+ assert.throws(cb, /callback called twice/);
+ });
+ pend.wait(cb);
+}
+
+function testCallingWaitTwice(cb) {
+ var pend = new Pend();
+ pend.go(function(cb) {
+ setTimeout(cb, 100);
+ });
+ pend.wait(function() {
+ pend.go(function(cb) {
+ setTimeout(cb, 50);
+ });
+ pend.go(function(cb) {
+ setTimeout(cb, 10);
+ });
+ pend.go(function(cb) {
+ setTimeout(cb, 20);
+ });
+ pend.wait(cb);
+ });
+}
+
+function testHoldFn(cb) {
+ var pend = new Pend();
+ setTimeout(pend.hold(), 100);
+ pend.go(function(cb) {
+ cb();
+ });
+ pend.wait(cb);
+}