| "use strict"; |
| |
| exports.__esModule = true; |
| |
| var _symbol = require("../core-js/symbol"); |
| |
| var _symbol2 = _interopRequireDefault(_symbol); |
| |
| var _promise = require("../core-js/promise"); |
| |
| var _promise2 = _interopRequireDefault(_promise); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| exports.default = function () { |
| function AwaitValue(value) { |
| this.value = value; |
| } |
| |
| function AsyncGenerator(gen) { |
| var front, back; |
| |
| function send(key, arg) { |
| return new _promise2.default(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; |
| |
| if (value instanceof AwaitValue) { |
| _promise2.default.resolve(value.value).then(function (arg) { |
| resume("next", arg); |
| }, function (arg) { |
| resume("throw", arg); |
| }); |
| } else { |
| settle(result.done ? "return" : "normal", result.value); |
| } |
| } 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 _symbol2.default === "function" && _symbol2.default.asyncIterator) { |
| AsyncGenerator.prototype[_symbol2.default.asyncIterator] = function () { |
| return this; |
| }; |
| } |
| |
| AsyncGenerator.prototype.next = function (arg) { |
| return this._invoke("next", arg); |
| }; |
| |
| AsyncGenerator.prototype.throw = function (arg) { |
| return this._invoke("throw", arg); |
| }; |
| |
| AsyncGenerator.prototype.return = function (arg) { |
| return this._invoke("return", arg); |
| }; |
| |
| return { |
| wrap: function wrap(fn) { |
| return function () { |
| return new AsyncGenerator(fn.apply(this, arguments)); |
| }; |
| }, |
| await: function _await(value) { |
| return new AwaitValue(value); |
| } |
| }; |
| }(); |