export default ( sourceIterator: AsyncIterator, transform: (payload: T) => U | Promise, ): AsyncIterator & AsyncIterable => { const applyTransformToResult = async ( nextResult: IteratorResult, ): Promise> => { return { done: nextResult.done, value: nextResult.done ? undefined as any : await transform(nextResult.value), }; }; return { next(): Promise> { return sourceIterator.next().then(applyTransformToResult); }, return(arg?: T): Promise> { if (sourceIterator.return) return sourceIterator.return(arg).then(applyTransformToResult); return Promise.resolve({ done: true, value: arg as any, }); }, throw(e?: any): Promise> { if (sourceIterator.throw) return sourceIterator.throw(e).then(applyTransformToResult); return Promise.reject(e); }, [Symbol.asyncIterator]() { return this; }, }; };