// 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 {};
