You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.3 KiB
62 lines
1.3 KiB
4 months ago
|
/**
|
||
|
* Given an AsyncIterable and a callback function, return an AsyncIterator
|
||
|
* which produces values mapped via calling the callback function.
|
||
|
*/
|
||
|
export function mapAsyncIterator(iterable, callback) {
|
||
|
const iterator = iterable[Symbol.asyncIterator]();
|
||
|
|
||
|
async function mapResult(result) {
|
||
|
if (result.done) {
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
return {
|
||
|
value: await callback(result.value),
|
||
|
done: false,
|
||
|
};
|
||
|
} catch (error) {
|
||
|
/* c8 ignore start */
|
||
|
// FIXME: add test case
|
||
|
if (typeof iterator.return === 'function') {
|
||
|
try {
|
||
|
await iterator.return();
|
||
|
} catch (_e) {
|
||
|
/* ignore error */
|
||
|
}
|
||
|
}
|
||
|
|
||
|
throw error;
|
||
|
/* c8 ignore stop */
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
async next() {
|
||
|
return mapResult(await iterator.next());
|
||
|
},
|
||
|
|
||
|
async return() {
|
||
|
// If iterator.return() does not exist, then type R must be undefined.
|
||
|
return typeof iterator.return === 'function'
|
||
|
? mapResult(await iterator.return())
|
||
|
: {
|
||
|
value: undefined,
|
||
|
done: true,
|
||
|
};
|
||
|
},
|
||
|
|
||
|
async throw(error) {
|
||
|
if (typeof iterator.throw === 'function') {
|
||
|
return mapResult(await iterator.throw(error));
|
||
|
}
|
||
|
|
||
|
throw error;
|
||
|
},
|
||
|
|
||
|
[Symbol.asyncIterator]() {
|
||
|
return this;
|
||
|
},
|
||
|
};
|
||
|
}
|