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