|
import { _await_value } from "./_await_value.js"; |
|
|
|
export function _async_generator(gen) { |
|
var front, back; |
|
|
|
function send(key, arg) { |
|
return new Promise(function(resolve, reject) { |
|
var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; |
|
if (back) back = back.next = request; |
|
else { |
|
front = back = request; |
|
resume(key, arg); |
|
} |
|
}); |
|
} |
|
|
|
function resume(key, arg) { |
|
try { |
|
var result = gen[key](arg); |
|
var value = result.value; |
|
var wrappedAwait = value instanceof _await_value; |
|
Promise.resolve(wrappedAwait ? value.wrapped : value).then(function(arg) { |
|
if (wrappedAwait) { |
|
resume("next", arg); |
|
|
|
return; |
|
} |
|
settle(result.done ? "return" : "normal", arg); |
|
}, function(err) { |
|
resume("throw", err); |
|
}); |
|
} catch (err) { |
|
settle("throw", err); |
|
} |
|
} |
|
|
|
function settle(type, value) { |
|
switch (type) { |
|
case "return": |
|
front.resolve({ value: value, done: true }); |
|
break; |
|
case "throw": |
|
front.reject(value); |
|
break; |
|
default: |
|
front.resolve({ value: value, done: false }); |
|
break; |
|
} |
|
front = front.next; |
|
if (front) resume(front.key, front.arg); |
|
else back = null; |
|
} |
|
|
|
this._invoke = send; |
|
|
|
if (typeof gen.return !== "function") this.return = undefined; |
|
} |
|
|
|
if (typeof Symbol === "function" && Symbol.asyncIterator) { |
|
_async_generator.prototype[Symbol.asyncIterator] = function() { |
|
return this; |
|
}; |
|
} |
|
|
|
_async_generator.prototype.next = function(arg) { |
|
return this._invoke("next", arg); |
|
}; |
|
|
|
_async_generator.prototype.throw = function(arg) { |
|
return this._invoke("throw", arg); |
|
}; |
|
|
|
_async_generator.prototype.return = function(arg) { |
|
return this._invoke("return", arg); |
|
}; |
|
export { _async_generator as _ }; |
|
|