export function* chunkBy( iterable: Iterable , predicate: (element: T, index: number) => unknown ): IterableIterator { let buffer: T[] = [] let index = 0 for (const element of iterable) { buffer.push(element) if (predicate(element, index)) { yield buffer buffer = [] } index++ } if (buffer.length) yield buffer }