diff --git a/src/index.ts b/src/index.ts index dd56ebb..c9ad378 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,7 +26,25 @@ export interface IArrayEnumerator extends IEnumerator { } export interface IEnumerable { + [Symbol.iterator](): Iterator + at(index: number): Nullable + atOrDefault(index: number, defaultValue: T): Nullable + atOrElse(index: number, defaultValue: () => T): Nullable + concat(other: IEnumerable): IEnumerable + count(): number + drop(limit: number): IEnumerable + empty(): boolean enumerator(): IEnumerator + every(predicate: Predicate): boolean + filter(predicate: Predicate): IEnumerable + find(predicate: Predicate): Nullable + findIndex(predicate: Predicate): number + flatMap(fn: Morphism>): IEnumerable + map(fn: Morphism): IEnumerable + reduce(fn: Reducer, init: U): U + some(predicate: Predicate): boolean + take(limit: number): IEnumerable + toArray(): T[] } export interface IEnumeratorFactory { @@ -648,10 +666,20 @@ export class Enumerable implements IEnumerable, Iterable { ) } + count(): number { + return this.reduce((acc: number) => acc + 1, 0) + } + drop(limit: number) { return new Enumerable(new DropEnumerator(this._enumerator, limit)) } + empty(): boolean { + const next = this._enumerator.moveNext() + this._enumerator.reset() + return !next + } + enumerator(): IEnumerator { return this._enumerator } @@ -678,6 +706,27 @@ export class Enumerable implements IEnumerable, Iterable { return new Enumerable(new FilterEnumerator(this._enumerator, predicate)) } + find(predicate: Predicate): Nullable { + const index = this.findIndex(predicate) + return index === -1 ? undefined : this._enumerator.current + } + + findIndex(predicate: Predicate): number { + let index = 0 + let found = false + + while (this._enumerator.moveNext()) { + if (predicate(this._enumerator.current, index)) { + found = true + break + } + index += 1 + } + + this._enumerator.reset() + return found ? index : -1 + } + flatMap(fn: Morphism>): IEnumerable { return new Enumerable(new FlatMapEnumerator(this._enumerator, fn)) } @@ -686,6 +735,18 @@ export class Enumerable implements IEnumerable, Iterable { return new Enumerable(new MapEnumerator(this._enumerator, fn)) } + reduce(fn: Reducer, init: U): U { + let index = 0 + let acc = init + + while (this._enumerator.moveNext()) { + acc = fn(acc, this._enumerator.current, index) + } + + this._enumerator.reset() + return acc + } + some(predicate: Predicate): boolean { let index = 0 while (this._enumerator.moveNext()) { @@ -703,6 +764,14 @@ export class Enumerable implements IEnumerable, Iterable { take(limit: number): IEnumerable { return new Enumerable(new TakeEnumerator(this._enumerator, limit)) } + + toArray(): T[] { + const result = [] + for (const item of this) { + result.push(item) + } + return result + } } export class ArrayEnumerble extends Enumerable {