/** * Like {@link Array#map}, but works with any iterable. * * @param iterable * @param cb * @returns an iterator. */ export function *map( iterable: Iterable, cb: (item: In, index: number) => Out, ): Generator { let i = 0; for (const item of iterable) { yield cb(item, i++); } } export function some( iterable: Iterable, cb: (item: In) => boolean, ): boolean { for (const item of iterable) { if (cb(item)) { return true; } } return false; } export function every( iterable: Iterable, cb: (item: In) => boolean, ): boolean { for (const item of iterable) { if (!cb(item)) { return false; } } return true; } export function find(iterable: Iterable, cb: (item: Val) => boolean): Val | undefined { for (const item of iterable) { if (cb(item)) { return item; } } return undefined; } /** * Combines two iterables, they will be iterated in order * * @param iterables */ export function *combinedIterator( ...iterables: Array> ): Generator { for (const iterable of iterables) { yield* iterable; } }