UNPKG

2.1 kBJavaScriptView Raw
1var _Symbol = require("../core-js/symbol");
2
3var _Promise = require("../core-js/promise");
4
5var AwaitValue = require("./AwaitValue");
6
7function AsyncGenerator(gen) {
8 var front, back;
9
10 function send(key, arg) {
11 return new _Promise(function (resolve, reject) {
12 var request = {
13 key: key,
14 arg: arg,
15 resolve: resolve,
16 reject: reject,
17 next: null
18 };
19
20 if (back) {
21 back = back.next = request;
22 } else {
23 front = back = request;
24 resume(key, arg);
25 }
26 });
27 }
28
29 function resume(key, arg) {
30 try {
31 var result = gen[key](arg);
32 var value = result.value;
33 var wrappedAwait = value instanceof AwaitValue;
34
35 _Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
36 if (wrappedAwait) {
37 resume("next", arg);
38 return;
39 }
40
41 settle(result.done ? "return" : "normal", arg);
42 }, function (err) {
43 resume("throw", err);
44 });
45 } catch (err) {
46 settle("throw", err);
47 }
48 }
49
50 function settle(type, value) {
51 switch (type) {
52 case "return":
53 front.resolve({
54 value: value,
55 done: true
56 });
57 break;
58
59 case "throw":
60 front.reject(value);
61 break;
62
63 default:
64 front.resolve({
65 value: value,
66 done: false
67 });
68 break;
69 }
70
71 front = front.next;
72
73 if (front) {
74 resume(front.key, front.arg);
75 } else {
76 back = null;
77 }
78 }
79
80 this._invoke = send;
81
82 if (typeof gen.return !== "function") {
83 this.return = undefined;
84 }
85}
86
87if (typeof _Symbol === "function" && _Symbol.asyncIterator) {
88 AsyncGenerator.prototype[_Symbol.asyncIterator] = function () {
89 return this;
90 };
91}
92
93AsyncGenerator.prototype.next = function (arg) {
94 return this._invoke("next", arg);
95};
96
97AsyncGenerator.prototype.throw = function (arg) {
98 return this._invoke("throw", arg);
99};
100
101AsyncGenerator.prototype.return = function (arg) {
102 return this._invoke("return", arg);
103};
104
105module.exports = AsyncGenerator;
\No newline at end of file