import { Enumerable, IEnumerable } from '../enumerable' import * as utils from '../utils' export function takeWhile(source: Iterable, predicate: (item: TSource, index?: number) => boolean): IEnumerable { utils.throws.ThrowIfNull('source', source) utils.throws.ThrowIfNull('predicate', predicate) return Enumerable.AsEnumerable(process(source, predicate)) } function* process(source: Iterable, predicate: (item: TSource, index?: number) => boolean): Iterable { let i = 0 for (let item of source) { if (predicate(item, i++)) { yield item } else { break } } }