@duydang2311/attempt
Version:
A functional type for error handling in JS/TS
124 lines (121 loc) • 5.97 kB
TypeScript
// Generated by dts-bundle-generator v9.5.1
export type PipeFn<T, R> = (value: T) => R;
export type HasPromise<T extends unknown[]> = true extends {
[K in keyof T]: T[K] extends Promise<any> ? true : false;
}[number] ? true : false;
export type PipeReturnType<T extends unknown[]> = T extends [
...infer _,
infer Last
] ? HasPromise<T> extends true ? Promise<Awaited<Last>> : Last : never;
export type InferOk<T> = T extends Ok<infer A> ? A : never;
export type InferFail<T> = T extends Fail<infer E> ? E : never;
export interface Ok<A> {
readonly ok: true;
readonly data: A;
}
export interface Fail<E> {
readonly ok: false;
readonly error: E;
}
export interface AttemptApi {
pipe<T>(this: T): T;
pipe<T, R1 = never>(this: T, fn1: PipeFn<T, R1>): PipeReturnType<[
R1
]>;
pipe<T, R1, R2 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>): PipeReturnType<[
R1,
R2
]>;
pipe<T, R1, R2, R3 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>): PipeReturnType<[
R1,
R2,
R3
]>;
pipe<T, R1, R2, R3, R4 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>): PipeReturnType<[
R1,
R2,
R3,
R4
]>;
pipe<T, R1, R2, R3, R4, R5 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>, fn5: PipeFn<Awaited<R4>, R5>): PipeReturnType<[
R1,
R2,
R3,
R4,
R5
]>;
pipe<T, R1, R2, R3, R4, R5, R6 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>, fn5: PipeFn<Awaited<R4>, R5>, fn6: PipeFn<Awaited<R5>, R6>): PipeReturnType<[
R1,
R2,
R3,
R4,
R5,
R6
]>;
pipe<T, R1, R2, R3, R4, R5, R6, R7 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>, fn5: PipeFn<Awaited<R4>, R5>, fn6: PipeFn<Awaited<R5>, R6>, fn7: PipeFn<Awaited<R6>, R7>): PipeReturnType<[
R1,
R2,
R3,
R4,
R5,
R6,
R7
]>;
pipe<T, R1, R2, R3, R4, R5, R6, R7, R8 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>, fn5: PipeFn<Awaited<R4>, R5>, fn6: PipeFn<Awaited<R5>, R6>, fn7: PipeFn<Awaited<R6>, R7>, fn8: PipeFn<Awaited<R7>, R8>): PipeReturnType<[
R1,
R2,
R3,
R4,
R5,
R6,
R7,
R8
]>;
pipe<T, R1, R2, R3, R4, R5, R6, R7, R8, R9 = never>(this: T, fn1: PipeFn<T, R1>, fn2: PipeFn<Awaited<R1>, R2>, fn3: PipeFn<Awaited<R2>, R3>, fn4: PipeFn<Awaited<R3>, R4>, fn5: PipeFn<Awaited<R4>, R5>, fn6: PipeFn<Awaited<R5>, R6>, fn7: PipeFn<Awaited<R6>, R7>, fn8: PipeFn<Awaited<R7>, R8>, fn9: PipeFn<Awaited<R8>, R9>): PipeReturnType<[
R1,
R2,
R3,
R4,
R5,
R6,
R7,
R8,
R9
]>;
}
export type Attempt<A = unknown, E = unknown> = (Ok<A> | Fail<E>) & AttemptApi;
export declare function attemptSync<A>(fn: () => A): <E>(mapException?: (e: unknown) => E) => Attempt<A, E>;
export declare function attemptAsync<A, E>(fn: () => Promise<Attempt<A, E>>): <TError2>(mapException?: (e: unknown) => TError2) => Promise<Attempt<A, E | TError2>>;
export declare function attemptAsync<A>(fn: () => Promise<A>): <E>(mapException?: (e: unknown) => E) => Promise<Attempt<A, E>>;
export declare function attemptOk<A>(data: A): Attempt<A, never>;
export declare function attemptFail<E>(error: E): Attempt<never, E>;
export declare function attemptMap<T extends Attempt, A>(f: (a: InferOk<T>) => Promise<A>): (attempt: T) => Promise<Attempt<A, InferFail<T>>>;
export declare function attemptMap<T extends Attempt, A>(f: (a: InferOk<T>) => A): (attempt: T) => Attempt<A, InferFail<T>>;
export declare function attemptFlatMap<T extends Attempt, T1 extends Attempt>(f: (a: InferOk<T>) => Promise<T1>): (attempt: T) => Promise<Attempt<InferOk<T1>, InferFail<T> | InferFail<T1>>>;
export declare function attemptFlatMap<T extends Attempt, T1 extends Attempt>(f: (a: InferOk<T>) => T1): (attempt: T) => Attempt<InferOk<T1>, InferFail<T> | InferFail<T1>>;
export declare function attemptMapError<T extends Attempt, E>(f: (e: InferFail<T>) => Promise<E>): (attempt: T) => Promise<Attempt<InferOk<T>, E>>;
export declare function attemptMapError<T extends Attempt, E>(f: (e: InferFail<T>) => E): (attempt: T) => Attempt<InferOk<T>, E>;
export declare function attemptFlatMapError<T extends Attempt, T1 extends Attempt>(f: (e: InferFail<T>) => Promise<T1>): (attempt: T) => Promise<Attempt<InferOk<T> | InferOk<T1>, InferFail<T1>>>;
export declare function attemptFlatMapError<T extends Attempt, T1 extends Attempt>(f: (e: InferFail<T>) => T1): (attempt: T) => Attempt<InferOk<T> | InferOk<T1>, InferFail<T1>>;
export declare function attemptUnwrap<T extends Attempt>(attempt: T): InferOk<T>;
export declare function attemptUnwrapOr<T extends Attempt>(attempt: T, defaultValue: InferOk<T>): InferOk<T>;
export declare function attemptUnwrapOr<T extends Attempt>(defaultValue: InferOk<T>): (attempt: T) => InferOk<T>;
export declare function attemptUnwrapOrElse<T extends Attempt>(attempt: T, f: (error: InferFail<T>) => InferOk<T>): InferOk<T>;
export declare function attemptUnwrapOrElse<T extends Attempt>(f: (error: InferFail<T>) => InferOk<T>): (attempt: T) => InferOk<T>;
export declare function isAttempt<A, E>(obj: unknown): obj is Attempt<A, E>;
export declare const attempt: {
readonly sync: typeof attemptSync;
readonly async: typeof attemptAsync;
readonly ok: typeof attemptOk;
readonly fail: typeof attemptFail;
readonly map: typeof attemptMap;
readonly flatMap: typeof attemptFlatMap;
readonly check: typeof isAttempt;
readonly mapError: typeof attemptMapError;
readonly flatMapError: typeof attemptFlatMapError;
readonly orElse: typeof attemptFlatMapError;
readonly unwrap: typeof attemptUnwrap;
readonly unwrapOr: typeof attemptUnwrapOr;
readonly unwrapOrElse: typeof attemptUnwrapOrElse;
};
export {};