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;
}