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