Spaces:
Paused
Paused
| /** | |
| * 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; | |
| }, | |
| }; | |
| } | |