Skip to content

Instantly share code, notes, and snippets.

@jcmoore
Last active October 25, 2017 06:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcmoore/6f853d793aeead94c4beb87a79f5a7ba to your computer and use it in GitHub Desktop.
Save jcmoore/6f853d793aeead94c4beb87a79f5a7ba to your computer and use it in GitHub Desktop.
degenerate.js -- promise fulfilling yield handler for generator functions
function degenerate (generator) {
return function () {
var iterator = generator.apply(this, arguments);
return new Promise(function fn (resolve, reject) {
return pass(void 0);
function pass(value) {
coop.call(iterator.next, iterator, value, resolve, reject, pass, fail);
}
function fail (err) {
coop.call(iterator.throw, iterator, err, resolve, reject, pass, fail);
}
});
}
}
function coop (iterator, value, resolve, reject, pass, fail) {
var resume = "function" === typeof this ? this : iterator.next;
var result;
do {
try {
if (!result) {
result = resume.call(iterator, value);
} else {
result = iterator.next(result.value);
}
} catch (err) {
if (reject) {
return reject(err);
} else {
throw err;
}
}
if (result.done) {
return resolve ? resolve(result.value) : result.value;
} else if (!result.value) {
continue;
} else if ("function" === typeof result.value.then) {
return result.value.then(pass, fail);
} else {
continue;
}
} while (true);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment