alot

Alot


Build Status NPM version ts

🌱 Lazy, ⛓️ Async and ⚡ Performance-Optimized Array/Stream methods


import alot from 'alot';

const users: IUser[];

// Sync
const userAgeGroups = alot(users)
.distinctBy(x => x.email)
.sortBy(x => x.createdAt)
.groupBy(x => x.age)
.skip(1)
.take(2)
.toArray();

// Async
const userData = await alot(users)
.mapAsync(async user => UserService.loadFooMeta(user.id))
.toArrayAsync({ threads: 4 });


Methods overview:

map <T, TResult> (fn: (x: T, i?: number) => TResult): IAlotStream<TResult>
mapAsync <T, TResult> (fn: (x: T, i?: number) => PromiseLike<TResult>): IAlotStream<TResult>
map <T, TResult> (fn: (x: T, i?: number) => TResult[]): IAlotStream<TResult>
mapAsync <T, TResult> (fn: (x: T, i?: number) => PromiseLike<TResult[]>): IAlotStream<TResult>
filter <T> (fn: (x: T, i?: number) => boolean): IAlotStream<T>
filterAsync <T> (fn: (x: T, i?: number) => PromiseLike<boolean>): IAlotStream<T>
forEach <T> (fn: (x: T, i?: number) => void | any): IAlotStream<T>
forEachAsync <T> (fn: (x: T, i?: number) => void | any): IAlotStream<T>
take <T> (count: number): IAlotStream<T>
takeWhile <T> (fn: (x: T) => boolean): IAlotStream<T>
takeWhileAsync <T> (fn: (x: T) => boolean | Promise<boolean>): IAlotStream<T>
skip <T> (count: number): IAlotStream<T>
skipWhile <T> (fn: (x: T, i?: number) => boolean): IAlotStream<T>
skipWhileAsync <T> (fn: (x: T, i?: number) => boolean | Promise<boolean>): IAlotStream<T>
groupBy <T, TKey = string > (fn: (x: T) => TKey): IAlotStream< { key: TKey[], values: T[] } >

Join elements from collection Inner and collection Outer by the matched Key. Elements with no matches are skipped.

// Inner Left Join
join <TOuter, TResult> (
inner: TInner[],
getKeyOuter: (x: TOuter) => string | number,
getKeyInner: (x: TInner) => string | number,
joinFn: (a: TOuter, b: TInner) => TResult
): IAlotStream< TResult >

Join elements from collection Inner and collection Outer by the matched Key. Elements with no matches are included as is.

// Outer Full Join
joinOuter <TOuter, TResult> (
inner: TInner[],
getKey: (x: TOuter) => string | number,
getForeignKey: (x: TInner) => string | number,
joinFn: (a?: TOuter, b?: TInner) => TResult
): IAlotStream< TResult >

Same as Array::concat

// Outer Full Join
concat <TSource> (
other: TOther[],
): IAlotStream< (TSource | TOther) >
distinctBy <T, TKey = string> (fn: (x: T, i?: number) => TKey): IAlotStream<T>
sortBy <T> (fn: (x: T, i?: number) => string | number, direction: 'asc' | 'desc' = 'asc'): IAlotStream<T>
sortBy <T> (property: string, direction: 'asc' | 'desc' = 'asc'): IAlotStream<T>
// also nested path are supported 'user.foo.username'

thenBy() specifies a secondary sort method that is used to further sort data that has already been sorted with a call to sortBy()

alot(arr).sortBy(x => x.age).thenBy(x => x.name).toArray()

Output Data

toArray(): T[]
toArrayAsync(options: {
threads?: number
errors?: 'reject' | 'include' | 'ignore'
} = { threads: 4, errors: 'reject' }): Promise<T[]>

errors 'reject' - all iterations will be stopped and the task will reject. errors 'include' - all iterations will be executed, and any throw or rejection will be in resulted array. errors 'ignore' - all iterations will be executed, and any throw or rejection are ignored. The resulted array could contain holes.

toDictionary<TKey = string | number, TOut = T>(keyFn: (x: T) => TKey, valFn?: (x: T) => TOut ): { [key: string]: TOut }
toDictionaryAsync<TKey = string | number, TOut = T>(keyFn: (x: T) => TKey | Promise<TKey>, valFn?: (x: T) => TOut | Promise<TOut> ): Promise<{ [key: string]: TOut }>
toDictionary<TKey = any, TOut = T>(keyFn: (x: T) => TKey, valFn?: (x: T) => TOut ): Map<TKey, TOut>
toDictionaryAsync<TKey = any, TOut = T>(keyFn: (x: T) => TKey | Promise<TKey>, valFn?: (x: T) => TOut | Promise<TOut> ): Promise<Map<TKey, TOut>>
first(matcher?: (x: T, i?: number) => boolean): T
find(matcher?: (x: T, i?: number) => boolean): T

firstAsync(matcher?: (x: T, i?: number) => boolean | Promise<boolean>): Promise<T>
find(matcher?: (x: T, i?: number) => boolean | Promise<boolean>): Promise<T>

Aggregation

sum      (fn: (x: T, i?: number) => number): number
sumAsync (fn: (x: T, i?: number) => number | Promise<number>): Promise<number>
max <TNumeric> (getVal: (x: T, i?: number) => TNumeric): TNumeric
maxAsync <TNumeric> (getVal: (x: T, i?: number) => TNumeric): Promise<TNumeric>

min <TNumeric> (getVal: (x: T, i?: number) => TOut): TNumeric
minAsync <TNumeric> (getVal: (x: T, i?: number) => TOut): Promise<TNumeric>

Static Methods

alot.fromObject(foo: any): Alot<{ key: string, value: string }>
alot.fromRange(start: number, endExcluded: number): Alot<number>

Supports ascending, e.g.[-1..10), and descending ranges - [10..-1)


Atma.js Project