@stnekroman/tstools
Version:
Set of handy tools for TypeScript development
33 lines (32 loc) • 3.33 kB
TypeScript
export declare namespace Functions {
type Callback = () => void;
type Provider<T> = () => T;
type MapFunction<T, R> = (data: T) => R;
type Consumer<T> = MapFunction<T, void>;
type Filter<T> = MapFunction<T, boolean>;
type Comparator<T> = (a: T, b: T) => number;
type ArgsFunction<ARGS extends unknown[], R> = (...args: ARGS) => R;
function noop(..._args: any[]): void;
function identity<T>(arg: T): Provider<T>;
function join<ARGS extends unknown[]>(...functions: ArgsFunction<ARGS, void>[]): ArgsFunction<ARGS, void>;
function extractor<T, K extends keyof T = keyof T>(field: K): MapFunction<T, T[K]>;
type PipedFunction<F extends ArgsFunction<any[], any>> = F & {
pipe<NEXT extends MapFunction<ReturnType<F>, any>>(next: NEXT): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT>>>;
pipe<NEXT1 extends MapFunction<ReturnType<F>, any>, NEXT2 extends MapFunction<ReturnType<NEXT1>, any>>(next1: NEXT1, next2: NEXT2): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT2>>>;
pipe<NEXT1 extends MapFunction<ReturnType<F>, any>, NEXT2 extends MapFunction<ReturnType<NEXT1>, any>, NEXT3 extends MapFunction<ReturnType<NEXT2>, any>>(next1: NEXT1, next2: NEXT2, next3: NEXT3): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT3>>>;
pipe<NEXT1 extends MapFunction<ReturnType<F>, any>, NEXT2 extends MapFunction<ReturnType<NEXT1>, any>, NEXT3 extends MapFunction<ReturnType<NEXT2>, any>, NEXT4 extends MapFunction<ReturnType<NEXT3>, any>>(next1: NEXT1, next2: NEXT2, next3: NEXT3, next4: NEXT4): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT4>>>;
pipe<NEXTS extends MapFunction<any, any>[]>(...nexts: NEXTS): PipedFunction<ArgsFunction<Parameters<F>, any>>;
};
function pipe<F extends ArgsFunction<any[], any>>(fn: F): PipedFunction<F>;
function pipe<F extends ArgsFunction<any[], any>, NEXT1 extends MapFunction<ReturnType<F>, any>>(fn: F, next1: NEXT1): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT1>>>;
function pipe<F extends ArgsFunction<any[], any>, NEXT1 extends MapFunction<ReturnType<F>, any>, NEXT2 extends MapFunction<ReturnType<NEXT1>, any>>(fn: F, next1: NEXT1, next2: NEXT2): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT2>>>;
function pipe<F extends ArgsFunction<any[], any>, NEXT1 extends MapFunction<ReturnType<F>, any>, NEXT2 extends MapFunction<ReturnType<NEXT1>, any>, NEXT3 extends MapFunction<ReturnType<NEXT2>, any>>(fn: F, next1: NEXT1, next2: NEXT2, next3: NEXT3): PipedFunction<ArgsFunction<Parameters<F>, ReturnType<NEXT3>>>;
function pipe<F extends ArgsFunction<any[], any>>(...fns: F[]): PipedFunction<ArgsFunction<Parameters<F>, any>>;
type MemoizedFunction<F extends ArgsFunction<any[], any>> = {
(...args: Parameters<F>): ReturnType<F>;
clear(): void;
};
function memo<F extends ArgsFunction<any[], any>>(func: F, cacheId?: Functions.MapFunction<Parameters<F>, string>): MemoizedFunction<F>;
function retry<F extends ArgsFunction<unknown[], unknown>>(func: F, count?: number, onError?: Functions.Consumer<unknown>): ReturnType<F>;
function retryAsync<F extends ArgsFunction<unknown[], Promise<unknown>>>(func: F, count?: number, onError?: Functions.Consumer<unknown>): Promise<Awaited<ReturnType<F>>>;
}