UNPKG

2.74 kBJavaScriptView Raw
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}();
\No newline at end of file