UNPKG

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