function* genMap(ia: Iterator, f: (i: number, a: A) => B) { let n = -1; while (true) { const result = ia.next(); if (result.done) { break; } n += 1; yield f(n, result.value); } } export const mapWithIndex_ = (fa: Iterable, f: (i: number, a: A) => B): Iterable => ({ [Symbol.iterator]: () => genMap(fa[Symbol.iterator](), f) }); export const mapWithIndex = (f: (i: number, a: A) => B) => (fa: Iterable): Iterable => ({ [Symbol.iterator]: () => genMap(fa[Symbol.iterator](), f) }); export const map_ = (fa: Iterable, f: (a: A) => B): Iterable => mapWithIndex_(fa, (_, a) => f(a)); export const map = (f: (a: A) => B) => (fa: Iterable): Iterable => map_(fa, f);