import { GetTypeOfIterable } from './utils.js' export type ExtractTypeTupleFromIterableTuple = { [K in keyof T]: GetTypeOfIterable } export function zip>>( iterable: Iterable , ...otherIterables: U ): IterableIterator<[T, ...ExtractTypeTupleFromIterableTuple]> { return _zip( iterable , ...otherIterables ) as IterableIterator<[T, ...ExtractTypeTupleFromIterableTuple]> } function* _zip(...iterables: Array>): IterableIterator { const length = iterables.length const iterators = iterables.map(iterable => iterable[Symbol.iterator]()) const dones = iterators.map(() => false) try { while (true) { const result = new Array(length) for (let i = 0; i < length; i++) { const { value, done } = iterators[i].next() if (done) { dones[i] = true return } result[i] = value } yield result } } finally { const undoneIterators = iterators.filter((_, i) => !dones[i]) undoneIterators.forEach(x => x.return?.()) } }