import { IEnumerable, IEnumerableFactory } from '../../types'; import { getIterableGenerator } from '../../utilities/utilityFunctions'; export function applySplit( factory: IEnumerableFactory, src: Iterable, separatorOrPredicate: TSource | ((item: TSource, index: number) => boolean) ): IEnumerable> { function* generator(): Generator> { let chunk: TSource[] = []; let i = 0; for (const item of src) { if ( (typeof separatorOrPredicate === 'function' && (separatorOrPredicate as (item: TSource, index: number) => boolean)(item, i)) || (typeof separatorOrPredicate !== 'function' && item === separatorOrPredicate) ) { yield factory.createArrayEnumerable(getIterableGenerator(chunk), chunk); chunk = []; } else { chunk.push(item); } i++; } if (chunk.length > 0) { yield factory.createArrayEnumerable(getIterableGenerator(chunk), chunk); } } return factory.createBasicEnumerable(generator); }