@osmium/iterate
Version:
A powerful, type-safe iteration library for JavaScript and TypeScript with advanced mapping, parallel processing, and flow control features
114 lines (113 loc) • 11 kB
TypeScript
export declare class Iterate<Source extends Iterate.Iterable, Mapper, MapperFlagUndefined> {
protected states?: Iterate.States<Source, Mapper>;
static createInstance<Source extends Iterate.Iterable, Mapper, MapperFlagUndefined>(): Iterate<Source, Mapper, MapperFlagUndefined>;
iterateAsync(values: Source, cb: Iterate.Callback<Source, Mapper, MapperFlagUndefined, true>, map: Mapper | undefined, mapUndefined: boolean | undefined, iterateKeys: boolean): Promise<Mapper extends undefined ? void : Mapper>;
iterateSync(values: Source, cb: Iterate.Callback<Source, Mapper, MapperFlagUndefined, false>, map: Mapper | undefined, mapUndefined: boolean | undefined, iterateKeys: boolean): Mapper extends undefined ? void : Mapper;
valuesLength<T extends Iterate.Iterable>(values: T): number;
getByIndex<T extends Iterate.Iterable>(index: number, values: T): {
value: Iterate.ResolveValue<T>;
idx: Iterate.ResolveIndex<T>;
} | null;
protected resolveTypes<T>(values: Iterate.Iterable, callbacks: Iterate.TypeDetectorCB<T>): T;
protected iterateArrayLikeSync(): Mapper | undefined;
protected iterateArrayLikeAsync(): Promise<Mapper | undefined>;
protected iterateMapSync(): Mapper | undefined;
protected iterateMapAsync(): Promise<Mapper | undefined>;
protected iterateObjectSync(): Mapper | undefined;
protected iterateObjectAsync(): Promise<Mapper | undefined>;
protected iterateNumberSync(): Mapper | undefined;
protected iterateNumberAsync(): Promise<Mapper | undefined>;
protected iterateStringSync(): Mapper | undefined;
protected iterateStringAsync(): Promise<Mapper | undefined>;
protected iterateTrueSync(): Mapper | undefined;
protected iterateTrueAsync(): Promise<Mapper | undefined>;
}
export declare namespace Iterate {
export interface IterableObject {
[Symbol.iterator]: Function;
}
export type TypeDetectorCB<T> = {
isNulled: (arg: null | undefined) => T;
isArray: (args: unknown[]) => T;
isSet: (args: Set<unknown>) => T;
isMap: (args: Map<unknown, unknown>) => T;
isNumber: (args: number) => T;
isTrue: (args: true) => T;
isString: (args: string) => T;
isObject: (args: Record<string, unknown>) => T;
isUnknown: (args: unknown) => T;
};
type ExtractObjectValueType<Source> = Source[keyof Source];
export class Controller<MapperIndex = unknown> implements Control<MapperIndex> {
static createInstance<MapperIndex = unknown>(row: Row<MapperIndex>): Controller<MapperIndex>;
row: Row<MapperIndex>;
constructor(row: Row<MapperIndex>);
get length(): number;
break(): void;
repeat(): void;
skip(): void;
shift(n: number): void;
get mapKey(): any;
set mapKey(key: any);
key(key: any): void;
getStates(): States;
}
export class Row<MapperIndex = unknown> {
static createInstance<MapperIndex = unknown>(states: States, index: MapperIndex): Row<MapperIndex>;
states: States;
mapKey: MapperIndex;
index: MapperIndex;
constructor(states: States, index: MapperIndex);
protected processMapper(mapperValue: ResolveValue<unknown>): boolean;
static processIterationSync(states: States<any, any>, value: any, index: any): void;
static processIterationAsync(states: States<any, any>, value: any, index: any): Promise<void>;
}
export class States<Source = any, Mapper = any> {
static createInstance<Source, Mapper>(args: Partial<States<Source, Mapper>>): States<Source, Mapper>;
isAsync: boolean;
values: Source;
cb: any;
map?: Mapper;
mapUndefined: boolean | undefined;
mapChanged: boolean;
iterateKeys: boolean;
length: number;
position: number;
break: boolean;
getStates(): States<Source, Mapper>;
}
export type Iterable = Array<any> | Record<any, any> | Set<any> | Map<any, any> | string | number | null | undefined | boolean;
export type Mappable = Exclude<Iterable, null>;
export type ResolveValue<Source> = Source extends Array<any> & ReadonlyArray<infer ArrayValueType> ? ArrayValueType : Source extends Set<any> & ReadonlySet<infer SetValueType> ? SetValueType : Source extends Map<any, any> & ReadonlyMap<any, infer MapValueType> ? MapValueType : Source extends number | true ? number : Source extends string ? string : Source extends IterableObject & Record<any, infer RecordValueType> ? RecordValueType extends (...args: any) => any ? never : RecordValueType : Source extends {
[key: string]: any;
} ? ExtractObjectValueType<Source> : unknown;
export type ResolveIndex<SourceType> = SourceType extends Array<any> | Set<any> ? number : SourceType extends Map<any, any> & ReadonlyMap<infer MapIndexType, any> ? MapIndexType : SourceType extends number | string | true ? number : SourceType extends IterableObject ? number : SourceType extends {
[key: string]: any;
} ? string : unknown;
export interface Control<_MapperIndex> {
break: () => void;
mapKey: any;
key: (index: any) => void;
shift: (pos: number) => void;
repeat: () => void;
skip: () => void;
getStates: () => States;
get length(): number;
}
export type CallbackResult<MapperValue, MapperFlagUndefined> = MapperFlagUndefined extends true ? MapperValue : MapperValue | void;
export type CallbackResolve<Source, SourceValue, SourceIndex, Mapper, _MapperIndex, MapperFlagUndefined, Control, IsAsync extends boolean = false> = Source extends false | null | undefined ? (value: undefined, index: undefined, control: Control) => IsAsync extends true ? Promise<any> : any : (value: SourceValue, index: SourceIndex, control: Control) => IsAsync extends true ? Promise<CallbackResult<ResolveValue<Mapper>, MapperFlagUndefined>> : CallbackResult<ResolveValue<Mapper>, MapperFlagUndefined>;
export type CallbackKeysResolve<Source, SourceIndex, SourceValue, Mapper, _MapperIndex, MapperFlagUndefined, Control, IsAsync extends boolean = false> = Source extends false | null | undefined ? (index: undefined, value: undefined, control: Control) => IsAsync extends true ? Promise<any> : any : (index: SourceIndex, value: SourceValue, control: Control) => IsAsync extends true ? Promise<CallbackResult<ResolveValue<Mapper>, MapperFlagUndefined>> : CallbackResult<ResolveValue<Mapper>, MapperFlagUndefined>;
export type Callback<Source, Mapper, MapperFlagUndefined, IsAsync extends boolean = false> = CallbackResolve<Source, ResolveValue<Source>, ResolveIndex<Source>, Mapper, ResolveIndex<Mapper>, MapperFlagUndefined, Control<Mapper extends undefined ? undefined : ResolveIndex<Mapper>>, IsAsync>;
export type CallbackKeys<Source, Mapper, MapperFlagUndefined, IsAsync extends boolean = false> = CallbackKeysResolve<Source, ResolveIndex<Source>, ResolveValue<Source>, Mapper, ResolveIndex<Mapper>, MapperFlagUndefined, Control<Mapper extends undefined ? undefined : ResolveIndex<Mapper>>, IsAsync>;
export {};
}
export declare function iterateSync<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.Callback<Source, Mapper, MapperFlagUndefined>, map?: Mapper & (Iterate.Mappable | undefined), mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): Mapper extends undefined ? void : Mapper;
export declare function iterateAsync<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.Callback<Source, Mapper, MapperFlagUndefined, true>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): Promise<Mapper extends undefined ? void : Mapper>;
export declare function iterate<Source extends Iterate.Iterable, Callback extends Iterate.Callback<Source, Mapper, MapperFlagUndefined, ReturnType<Callback> extends Promise<any> ? true : false>, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Callback & Iterate.Callback<Source, Mapper, MapperFlagUndefined, ReturnType<Callback> extends Promise<any> ? true : false>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): any;
export declare function iterateKeysSync<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.CallbackKeys<Source, Mapper, MapperFlagUndefined>, map?: Mapper & (Iterate.Mappable | undefined), mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): Mapper extends undefined ? void : Mapper;
export declare function iterateKeysAsync<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.CallbackKeys<Source, Mapper, MapperFlagUndefined, true>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): Promise<Mapper extends undefined ? void : Mapper>;
export declare function iterateKeys<Source extends Iterate.Iterable, Callback extends Iterate.CallbackKeys<Source, Mapper, MapperFlagUndefined, ReturnType<Callback> extends Promise<any> ? true : false>, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Callback & Iterate.CallbackKeys<Source, Mapper, MapperFlagUndefined, ReturnType<Callback> extends Promise<any> ? true : false>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): any;
export declare function iterateParallel<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.Callback<Source, Mapper, MapperFlagUndefined, true>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined, iterateKeys?: boolean): Promise<Mapper extends undefined ? void : Mapper>;
export declare function iterateKeysParallel<Source extends Iterate.Iterable, Mapper = undefined, MapperFlagUndefined = undefined>(values: Source, cb: Iterate.CallbackKeys<Source, Mapper, MapperFlagUndefined, true>, map?: (Mapper & Iterate.Mappable) | undefined, mapUndefined?: MapperFlagUndefined extends boolean | undefined ? MapperFlagUndefined : undefined): Promise<Mapper extends undefined ? void : Mapper>;
export declare function seriesPageableRange(start: number, end: number, inPage: number): [number, number][];
export declare function iterateParallelLimit<Source extends Iterate.Iterable>(limit: number, values: Source, cb: Iterate.Callback<Source, undefined, undefined, true>, iterateKeys?: boolean): Promise<void>;