import Function from "./Function"; import InfiniteIterator from "./InfiniteIterator"; import Predicate from "./Predicate"; import Stream from "./Stream"; export default class InfiniteStream implements Stream { private it: InfiniteIterator; constructor(private initial: E, private func: Function) { this.it = InfiniteIterator.of(initial, func); } public static of(initial: E, func: Function): InfiniteStream { return new InfiniteStream(initial, func); } public filter(filter: Predicate): InfiniteStream { let it = this.it; let initial: E; do { initial = it.next().value; } while (!filter(initial)); return InfiniteStream.of(initial, previous => { let e: E; do { e = it.next().value; } while (!filter(e)); return e; }); } public map(map: Function): InfiniteStream { let it = this.it; return InfiniteStream.of(map(it.next().value), previous => map(it.next().value)); } public limit(size: number): E[] { let values: E[] = []; while (size-- > 0) { values.push(this.it.next().value); } return values; } public skip(amount: number): this { while (amount-- > 0) { this.it.next(); } return this; } }