diff --git a/src/system/iterable.ts b/src/system/iterable.ts index 207752f..c349539 100644 --- a/src/system/iterable.ts +++ b/src/system/iterable.ts @@ -1,6 +1,13 @@ 'use strict'; export namespace Iterables { + export function every(source: Iterable | IterableIterator, predicate: (item: T) => boolean): boolean { + for (const item of source) { + if (!predicate(item)) return false; + } + return true; + } + export function* filter(source: Iterable | IterableIterator, predicate: (item: T) => boolean): Iterable { for (const item of source) { if (predicate(item)) yield item; @@ -39,6 +46,10 @@ export namespace Iterables { } } + export function has(source: Iterable | IterableIterator, item: T): boolean { + return some(source, _ => _ === item); + } + export function isIterable(source: Iterable): boolean { return typeof source[Symbol.iterator] === 'function'; } @@ -59,10 +70,37 @@ export namespace Iterables { return source.next().value; } + export function* skip(source: Iterable | IterableIterator, count: number): Iterable { + let i = 0; + for (const item of source) { + if (i >= count) yield item; + i++; + } + } + export function some(source: Iterable | IterableIterator, predicate: (item: T) => boolean): boolean { for (const item of source) { if (predicate(item)) return true; } return false; } + + export function* take(source: Iterable | IterableIterator, count: number): Iterable { + if (count > 0) { + let i = 0; + for (const item of source) { + yield item; + i++; + if (i >= count) break; + } + } + } + + export function* union(...sources: (Iterable | IterableIterator)[]): Iterable { + for (const source of sources) { + for (const item of source) { + yield item; + } + } + } } \ No newline at end of file