UNPKG

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