add more enumerable methods; update ienumerable

This commit is contained in:
Rowan 2025-05-01 20:13:00 -05:00
parent f3bfae6e14
commit 79755d60cc

View file

@ -26,7 +26,25 @@ export interface IArrayEnumerator<T> extends IEnumerator<T> {
}
export interface IEnumerable<T> {
[Symbol.iterator](): Iterator<T>
at(index: number): Nullable<T>
atOrDefault(index: number, defaultValue: T): Nullable<T>
atOrElse(index: number, defaultValue: () => T): Nullable<T>
concat(other: IEnumerable<T>): IEnumerable<T>
count(): number
drop(limit: number): IEnumerable<T>
empty(): boolean
enumerator(): IEnumerator<T>
every(predicate: Predicate<T>): boolean
filter(predicate: Predicate<T>): IEnumerable<T>
find(predicate: Predicate<T>): Nullable<T>
findIndex(predicate: Predicate<T>): number
flatMap<U>(fn: Morphism<T, IEnumerator<U>>): IEnumerable<U>
map<U>(fn: Morphism<T, U>): IEnumerable<U>
reduce<U>(fn: Reducer<T, U>, init: U): U
some(predicate: Predicate<T>): boolean
take(limit: number): IEnumerable<T>
toArray(): T[]
}
export interface IEnumeratorFactory<T> {
@ -648,10 +666,20 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
)
}
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<T> {
return this._enumerator
}
@ -678,6 +706,27 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
return new Enumerable(new FilterEnumerator(this._enumerator, predicate))
}
find(predicate: Predicate<T>): Nullable<T> {
const index = this.findIndex(predicate)
return index === -1 ? undefined : this._enumerator.current
}
findIndex(predicate: Predicate<T>): 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<U>(fn: Morphism<T, IEnumerator<U>>): IEnumerable<U> {
return new Enumerable(new FlatMapEnumerator(this._enumerator, fn))
}
@ -686,6 +735,18 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
return new Enumerable(new MapEnumerator(this._enumerator, fn))
}
reduce<U>(fn: Reducer<T, U>, 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<T>): boolean {
let index = 0
while (this._enumerator.moveNext()) {
@ -703,6 +764,14 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
take(limit: number): IEnumerable<T> {
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<T> extends Enumerable<T> {