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> {
|
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>
|
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> {
|
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) {
|
drop(limit: number) {
|
||||||
return new Enumerable(new DropEnumerator(this._enumerator, limit))
|
return new Enumerable(new DropEnumerator(this._enumerator, limit))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
empty(): boolean {
|
||||||
|
const next = this._enumerator.moveNext()
|
||||||
|
this._enumerator.reset()
|
||||||
|
return !next
|
||||||
|
}
|
||||||
|
|
||||||
enumerator(): IEnumerator<T> {
|
enumerator(): IEnumerator<T> {
|
||||||
return this._enumerator
|
return this._enumerator
|
||||||
}
|
}
|
||||||
|
@ -678,6 +706,27 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
|
||||||
return new Enumerable(new FilterEnumerator(this._enumerator, predicate))
|
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> {
|
flatMap<U>(fn: Morphism<T, IEnumerator<U>>): IEnumerable<U> {
|
||||||
return new Enumerable(new FlatMapEnumerator(this._enumerator, fn))
|
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))
|
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 {
|
some(predicate: Predicate<T>): boolean {
|
||||||
let index = 0
|
let index = 0
|
||||||
while (this._enumerator.moveNext()) {
|
while (this._enumerator.moveNext()) {
|
||||||
|
@ -703,6 +764,14 @@ export class Enumerable<T> implements IEnumerable<T>, Iterable<T> {
|
||||||
take(limit: number): IEnumerable<T> {
|
take(limit: number): IEnumerable<T> {
|
||||||
return new Enumerable(new TakeEnumerator(this._enumerator, limit))
|
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> {
|
export class ArrayEnumerble<T> extends Enumerable<T> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue