import { IEnumerable, IEnumerableFactory } from '../../types'; import { getIterableGenerator } from '../../utilities/utilityFunctions'; export function applyTake( factory: IEnumerableFactory, src: Iterable, count: number ): IEnumerable { if (count <= 0) { throw new Error('Count must be greater than 0'); } function* generator(): Generator { let i = 0; for (const item of src) { if (i >= count) { return; } i++; yield item; } } return factory.createBasicEnumerable(generator); } export function applyTakeEvery( factory: IEnumerableFactory, src: Iterable, step: number ): IEnumerable { if (step <= 0) { throw new Error('Count must be greater than 0'); } return factory.createBasicEnumerable(getIterableGenerator(src)).where((_, i) => i % step === 0); } export function applyTakeLast( factory: IEnumerableFactory, src: Iterable, count: number ): IEnumerable { if (count <= 0) { throw new Error('Count must be greater than 0'); } function* generator(): Generator { const arr = [...src]; for (let i = Math.max(arr.length - count, 0); i < arr.length; i++) { yield arr[i]; } } return factory.createBasicEnumerable(generator); } export function applyTakeWhile( factory: IEnumerableFactory, src: Iterable, predicate: (item: TSource, index: number) => boolean ): IEnumerable { function* generator(): Generator { let i = 0; for (const item of src) { if (!predicate(item, i)) { return; } i++; yield item; } } return factory.createBasicEnumerable(generator); }