aboutsummaryrefslogtreecommitdiff
path: root/node_modules/when/generator.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/when/generator.js')
-rw-r--r--node_modules/when/generator.js105
1 files changed, 105 insertions, 0 deletions
diff --git a/node_modules/when/generator.js b/node_modules/when/generator.js
new file mode 100644
index 000000000..e0381f06e
--- /dev/null
+++ b/node_modules/when/generator.js
@@ -0,0 +1,105 @@
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
+/** @author John Hann */
+
+(function(define) { 'use strict';
+define(function(require) {
+
+ var when = require('./when');
+ var slice = Array.prototype.slice;
+ var Promise = when.Promise;
+ var reject = Promise.reject;
+
+ /**
+ * Lift a generator to create a function that can suspend and
+ * resume using the `yield` keyword to await promises.
+ * @param {function} generator
+ * @return {function}
+ */
+ function lift(generator) {
+ return function() {
+ return run(generator, this, arguments);
+ };
+ }
+
+ /**
+ * Immediately call a generator as a promise-aware coroutine
+ * that can suspend and resume using the `yield` keyword to
+ * await promises. Additional arguments after the first will
+ * be passed through to the generator.
+ * @param {function} generator
+ * @returns {Promise} promise for the ultimate value returned
+ * from the generator.
+ */
+ function call(generator /*x, y, z...*/) {
+ /*jshint validthis:true*/
+ return run(generator, this, slice.call(arguments, 1));
+ }
+
+ /**
+ * Immediately apply a generator, with the supplied args array,
+ * as a promise-aware coroutine that can suspend and resume
+ * using the `yield` keyword to await promises.
+ * @param {function} generator
+ * @param {Array} args arguments with which to initialize the generator
+ * @returns {Promise} promise for the ultimate value returned
+ * from the generator.
+ */
+ function apply(generator, args) {
+ /*jshint validthis:true*/
+ return run(generator, this, args || []);
+ }
+
+ /**
+ * Helper to initiate the provided generator as a coroutine
+ * @returns {*}
+ */
+ function run(generator, thisArg, args) {
+ return runNext(void 0, generator.apply(thisArg, args));
+ }
+
+ function runNext(x, iterator) {
+ try {
+ return handle(iterator.next(x), iterator);
+ } catch(e) {
+ return reject(e);
+ }
+ }
+
+ function next(x) {
+ /*jshint validthis:true*/
+ return runNext(x, this);
+ }
+
+ function error(e) {
+ /*jshint validthis:true*/
+ try {
+ return handle(this.throw(e), this);
+ } catch(e) {
+ return reject(e);
+ }
+ }
+
+ function handle(result, iterator) {
+ if(result.done) {
+ return result.value;
+ }
+
+ var h = Promise._handler(result.value);
+ if(h.state() > 0) {
+ return runNext(h.value, iterator);
+ }
+
+ var p = Promise._defer();
+ h.chain(p._handler, iterator, next, error);
+ return p;
+ }
+
+ return {
+ lift: lift,
+ call: call,
+ apply: apply
+ };
+
+});
+}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));