export function* zip(a: Iterable, b: Iterable): Generator<[A, B], void, void> { const iter_a = a[Symbol.iterator](), iter_b = b[Symbol.iterator](); while (true) { const next_a = next(iter_a), next_b = next(iter_b); if (next_a === null || next_b === null) return; yield [next_a, next_b]; } } export function next(iterator: Iterator) { const result = iterator.next().value; if (result === undefined) return null; else return result as T; }