UNPKG

2.2 kBJavaScriptView Raw
1import { isPromise } from './jsutils.js';
2/**
3 * Given an AsyncIterable and a callback function, return an AsyncIterator
4 * which produces values mapped via calling the callback function.
5 */
6export function mapAsyncIterator(iterator, onNext, onError, onEnd) {
7 if (Symbol.asyncIterator in iterator) {
8 iterator = iterator[Symbol.asyncIterator]();
9 }
10 let $return;
11 let abruptClose;
12 let onEndWithValue;
13 if (onEnd) {
14 onEndWithValue = value => {
15 const onEnd$ = onEnd();
16 return isPromise(onEnd$) ? onEnd$.then(() => value) : value;
17 };
18 }
19 if (typeof iterator.return === 'function') {
20 $return = iterator.return;
21 abruptClose = (error) => {
22 const rethrow = () => Promise.reject(error);
23 return $return.call(iterator).then(rethrow, rethrow);
24 };
25 }
26 function mapResult(result) {
27 if (result.done) {
28 return onEndWithValue ? onEndWithValue(result) : result;
29 }
30 return asyncMapValue(result.value, onNext).then(iteratorResult, abruptClose);
31 }
32 let mapReject;
33 if (onError) {
34 // Capture rejectCallback to ensure it cannot be null.
35 const reject = onError;
36 mapReject = (error) => asyncMapValue(error, reject).then(iteratorResult, abruptClose);
37 }
38 return {
39 next() {
40 return iterator.next().then(mapResult, mapReject);
41 },
42 return() {
43 const res$ = $return
44 ? $return.call(iterator).then(mapResult, mapReject)
45 : Promise.resolve({ value: undefined, done: true });
46 return onEndWithValue ? res$.then(onEndWithValue) : res$;
47 },
48 throw(error) {
49 if (typeof iterator.throw === 'function') {
50 return iterator.throw(error).then(mapResult, mapReject);
51 }
52 return Promise.reject(error).catch(abruptClose);
53 },
54 [Symbol.asyncIterator]() {
55 return this;
56 },
57 };
58}
59function asyncMapValue(value, callback) {
60 return new Promise(resolve => resolve(callback(value)));
61}
62function iteratorResult(value) {
63 return { value, done: false };
64}