add more enumerable methods; update ienumerable
This commit is contained in:
parent
f3bfae6e14
commit
79755d60cc
1 changed files with 69 additions and 0 deletions
69
src/index.ts
69
src/index.ts
|
@ -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> {
|
||||
|
|
Loading…
Add table
Reference in a new issue