UNPKG

@duydang2311/attempt

Version:

A functional type for error handling in JS/TS

124 lines (121 loc) 5.97 kB
// 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 {};