forked from babel/babel
/
asyncIterator.js
62 lines (57 loc) · 1.8 KB
/
asyncIterator.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
56
57
58
59
60
61
62
/* @minVersion 7.15.9 */
export default function _asyncIterator(iterable) {
var method, async, sync;
if (typeof Symbol !== "undefined") {
async = Symbol.asyncIterator;
sync = Symbol.iterator;
}
do {
if (!sync) {
async = "@@asyncIterator";
sync = "@@iterator";
}
if (async && (method = iterable[async]) != null) {
return method.call(iterable);
}
if ((method = iterable[sync]) != null) {
return new AsyncFromSyncIterator(method.call(iterable));
}
} while (!(sync === "@@iterator" || (sync = null)));
throw new TypeError("Object is not async iterable");
}
function AsyncFromSyncIterator(s) {
AsyncFromSyncIterator = function (s) {
this.s = s;
this.n = s.next;
};
AsyncFromSyncIterator.prototype = {
/* SyncIterator */ s: null,
/* SyncIterator.[[Next]] */ n: null,
next: function () {
return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
},
return: function (value) {
var ret = this.s.return;
if (ret === undefined) {
return Promise.resolve({ value: value, done: true });
}
return AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));
},
throw: function (value) {
var thr = this.s.return;
if (thr === undefined) return Promise.reject(value);
return AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));
},
};
function AsyncFromSyncIteratorContinuation(r) {
// This step is _before_ calling AsyncFromSyncIteratorContinuation in the spec.
if (Object(r) !== r) {
return Promise.reject(new TypeError(r + " is not an object."));
}
var done = r.done;
return Promise.resolve(r.value).then(function (value) {
return { value: value, done: done };
});
}
return new AsyncFromSyncIterator(s);
}