Skip to content

Instantly share code, notes, and snippets.

@rwaldron
Created January 23, 2014 23:35
Show Gist options
  • Save rwaldron/8589084 to your computer and use it in GitHub Desktop.
Save rwaldron/8589084 to your computer and use it in GitHub Desktop.
macro function! {
case { $macro $name ($params ...) { $body ...} } => {
letstx $await = [makeIdent("await", #{$macro})];
return #{
function $name($params ...) {
return spawn(gen($params ...));
}
function* gen($params ...) {
let $await = macro {
case { _ $[$rest ...] } => {
return #{yield $[$rest ...]}
}
}
$body ...
}
}
}
}
function spawn(gen) {
function _next(v) { return handle(gen.next(v)); }
function _throw(e) { return handle(gen.throw(e)); }
function handle(result) {
var value = result.value;
if (!result.done && value && typeof value.then === "function") {
return value.then(_next, _throw);
}
return value;
}
return new Promise(function(resolve, reject) {
Promise.cast(_next()).then(resolve, reject);
});
}
function! test(array) {
array = await promiseMap(array, getAsync);
return promiseMap(array, getNameAync);
}
// See http://taskjs.org for the original.
function spawn(thunk) {
var gen;
function _next(v) { return handle(gen.next(v)); }
function _throw(e) { return handle(gen.throw(e)); }
function handle(result) {
var value = result.value;
if (!result.done && value && typeof value.then === "function") {
return value.then(_next, _throw);
}
return value;
}
return new Promise(function(resolve, reject) {
gen = thunk();
Promise.cast(_next()).then(resolve, reject);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment