1 | import _Symbol from "../../core-js/symbol";
|
2 | import _Promise from "../../core-js/promise";
|
3 | import AwaitValue from "./AwaitValue";
|
4 | export 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 |
|
84 | if (typeof _Symbol === "function" && _Symbol.asyncIterator) {
|
85 | AsyncGenerator.prototype[_Symbol.asyncIterator] = function () {
|
86 | return this;
|
87 | };
|
88 | }
|
89 |
|
90 | AsyncGenerator.prototype.next = function (arg) {
|
91 | return this._invoke("next", arg);
|
92 | };
|
93 |
|
94 | AsyncGenerator.prototype.throw = function (arg) {
|
95 | return this._invoke("throw", arg);
|
96 | };
|
97 |
|
98 | AsyncGenerator.prototype.return = function (arg) {
|
99 | return this._invoke("return", arg);
|
100 | }; |
\ | No newline at end of file |