1"use strict"; 2 3exports.__esModule = true; 4 5var _symbol = require("../core-js/symbol"); 6 7var _symbol2 = _interopRequireDefault(_symbol); 8 9var _promise = require("../core-js/promise"); 10 11var _promise2 = _interopRequireDefault(_promise); 12 13function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 15exports.default = function () { 16 function AwaitValue(value) { 17 this.value = value; 18 } 19 20 function AsyncGenerator(gen) { 21 var front, back; 22 23 function send(key, arg) { 24 return new _promise2.default(function (resolve, reject) { 25 var request = { 26 key: key, 27 arg: arg, 28 resolve: resolve, 29 reject: reject, 30 next: null 31 }; 32 33 if (back) { 34 back = back.next = request; 35 } else { 36 front = back = request; 37 resume(key, arg); 38 } 39 }); 40 } 41 42 function resume(key, arg) { 43 try { 44 var result = gen[key](arg); 45 var value = result.value; 46 47 if (value instanceof AwaitValue) { 48 _promise2.default.resolve(value.value).then(function (arg) { 49 resume("next", arg); 50 }, function (arg) { 51 resume("throw", arg); 52 }); 53 } else { 54 settle(result.done ? "return" : "normal", result.value); 55 } 56 } catch (err) { 57 settle("throw", err); 58 } 59 } 60 61 function settle(type, value) { 62 switch (type) { 63 case "return": 64 front.resolve({ 65 value: value, 66 done: true 67 }); 68 break; 69 70 case "throw": 71 front.reject(value); 72 break; 73 74 default: 75 front.resolve({ 76 value: value, 77 done: false 78 }); 79 break; 80 } 81 82 front = front.next; 83 84 if (front) { 85 resume(front.key, front.arg); 86 } else { 87 back = null; 88 } 89 } 90 91 this._invoke = send; 92 93 if (typeof gen.return !== "function") { 94 this.return = undefined; 95 } 96 } 97 98 if (typeof _symbol2.default === "function" && _symbol2.default.asyncIterator) { 99 AsyncGenerator.prototype[_symbol2.default.asyncIterator] = function () { 100 return this; 101 }; 102 } 103 104 AsyncGenerator.prototype.next = function (arg) { 105 return this._invoke("next", arg); 106 }; 107 108 AsyncGenerator.prototype.throw = function (arg) { 109 return this._invoke("throw", arg); 110 }; 111 112 AsyncGenerator.prototype.return = function (arg) { 113 return this._invoke("return", arg); 114 }; 115 116 return { 117 wrap: function wrap(fn) { 118 return function () { 119 return new AsyncGenerator(fn.apply(this, arguments)); 120 }; 121 }, 122 await: function _await(value) { 123 return new AwaitValue(value); 124 } 125 }; 126}();