/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; function* filter(it: IterableIterator, condition: (t: T, i: number) => boolean): IterableIterator { let i = 0; for (let t of it) { if (condition(t, i++)) { yield t; } } } function* map(it: IterableIterator, fn: (t: T, i: number) => R): IterableIterator { let i = 0; for (let t of it) { yield fn(t, i++); } } export interface FunctionalIterator extends Iterable { filter(condition: (t: T, i: number) => boolean): FunctionalIterator; map(fn: (t: T, i: number) => R): FunctionalIterator; toArray(): T[]; } class FunctionalIteratorImpl implements FunctionalIterator { constructor(private iterator: IterableIterator) { } filter(condition: (t: T, i: number) => boolean): FunctionalIterator { return new FunctionalIteratorImpl(filter(this.iterator, condition)); } map(fn: (t: T, i: number) => R): FunctionalIterator { return new FunctionalIteratorImpl(map(this.iterator, fn)); } toArray(): T[] { return Array.from(this.iterator); } [Symbol.iterator](): IterableIterator { return this.iterator; } } export function iterate(obj: T[] | IterableIterator): FunctionalIterator { if (Array.isArray(obj)) { return new FunctionalIteratorImpl(obj[Symbol.iterator]()); } return new FunctionalIteratorImpl(obj); }