forked from babel/babel
/
asyncGeneratorDelegate.js
55 lines (47 loc) · 1.14 KB
/
asyncGeneratorDelegate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* @minVersion 7.0.0-beta.0 */
import OverloadYield from "OverloadYield";
export default function _asyncGeneratorDelegate(inner) {
var iter = {},
// See the comment in AsyncGenerator to understand what this is.
waiting = false;
function pump(key, value) {
waiting = true;
value = new Promise(function (resolve) {
resolve(inner[key](value));
});
return {
done: false,
value: new OverloadYield(value, /* kind: delegate */ 1),
};
}
iter[(typeof Symbol !== "undefined" && Symbol.iterator) || "@@iterator"] =
function () {
return this;
};
iter.next = function (value) {
if (waiting) {
waiting = false;
return value;
}
return pump("next", value);
};
if (typeof inner.throw === "function") {
iter.throw = function (value) {
if (waiting) {
waiting = false;
throw value;
}
return pump("throw", value);
};
}
if (typeof inner.return === "function") {
iter.return = function (value) {
if (waiting) {
waiting = false;
return value;
}
return pump("return", value);
};
}
return iter;
}