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; } export function split_once(text: string, separator: string) { const cursor = text.indexOf(separator); if (cursor === -1) return [text, null] as const; const left = text.slice(0, cursor); const right = text.slice(cursor + separator.length); return [left, right] as const; }