import { Enumerable, IEnumerable } from '../enumerable' import * as utils from '../utils' export function selectMany( source: Iterable, collectionSelector: (item: TSource, index?: number) => IEnumerable, resultSelector?: (item: TSource, collection: TCollection) => TResult ): IEnumerable { utils.throws.ThrowIfNull('source', source) utils.throws.ThrowIfNull('collectionSelector', collectionSelector) let _resultSelector: any = resultSelector || ((item, collection) => collection) return Enumerable.AsEnumerable(mapping(source, collectionSelector, _resultSelector)) } function* mapping( source: Iterable, collectionSelector: (item: TSource, index?: number) => IEnumerable, resultSelector?: (item: TSource, collection: TCollection) => TResult ): Iterable { let index = 0 for (let item of source) { let collections = collectionSelector(item, index++) if (collections) { for (let collection of collections) { yield resultSelector(item, collection) } } } }