UNPKG

2.24 kBJavaScriptView Raw
1function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
3import { $$asyncIterator, getAsyncIterator } from 'iterall';
4
5/**
6 * Given an AsyncIterable and a callback function, return an AsyncIterator
7 * which produces values mapped via calling the callback function.
8 */
9export default function mapAsyncIterator(iterable, callback, rejectCallback) {
10 var iterator = getAsyncIterator(iterable);
11 var $return;
12 var abruptClose; // $FlowFixMe(>=0.68.0)
13
14 if (typeof iterator.return === 'function') {
15 $return = iterator.return;
16
17 abruptClose = function abruptClose(error) {
18 var rethrow = function rethrow() {
19 return Promise.reject(error);
20 };
21
22 return $return.call(iterator).then(rethrow, rethrow);
23 };
24 }
25
26 function mapResult(result) {
27 return result.done ? result : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
28 }
29
30 var mapReject;
31
32 if (rejectCallback) {
33 // Capture rejectCallback to ensure it cannot be null.
34 var reject = rejectCallback;
35
36 mapReject = function mapReject(error) {
37 return asyncMapValue(error, reject).then(iteratorResult, abruptClose);
38 };
39 }
40 /* TODO: Flow doesn't support symbols as keys:
41 https://github.com/facebook/flow/issues/3258 */
42
43
44 return _defineProperty({
45 next: function next() {
46 return iterator.next().then(mapResult, mapReject);
47 },
48 return: function _return() {
49 return $return ? $return.call(iterator).then(mapResult, mapReject) : Promise.resolve({
50 value: undefined,
51 done: true
52 });
53 },
54 throw: function _throw(error) {
55 // $FlowFixMe(>=0.68.0)
56 if (typeof iterator.throw === 'function') {
57 return iterator.throw(error).then(mapResult, mapReject);
58 }
59
60 return Promise.reject(error).catch(abruptClose);
61 }
62 }, $$asyncIterator, function () {
63 return this;
64 });
65}
66
67function asyncMapValue(value, callback) {
68 return new Promise(function (resolve) {
69 return resolve(callback(value));
70 });
71}
72
73function iteratorResult(value) {
74 return {
75 value: value,
76 done: false
77 };
78}