12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /**
- * 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;
- },
- };
- }
|