// deno-lint-ignore-file no-namespace no-explicit-any import type { TaggedError } from "../error/tagged-error.ts"; import type { AsyncResult } from "../result/async-result.ts"; export namespace Run { // prettier-ignore export function seq< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, ): AsyncResult; // prettier-ignore export function seq< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, T3, TE3 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, fn3: (value: T2) => AsyncResult, ): AsyncResult; // prettier-ignore export function seq< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, T3, TE3 extends TaggedError, T4, TE4 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, fn3: (value: T2) => AsyncResult, fn4: (value: T3) => AsyncResult, ): AsyncResult; export function seq( ...fns: ((...args: any[]) => AsyncResult)[] ): AsyncResult { let result = fns[0]!(); for (let i = 1; i < fns.length; i++) { result = result.flatMap((value) => fns[i]!(value)); } return result; } // prettier-ignore export function seqOrThrow< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, ): Promise; // prettier-ignore export function seqOrThrow< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, T3, TE3 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, fn3: (value: T2) => AsyncResult, ): Promise; export function seqOrThrow( ...fns: ((...args: any[]) => AsyncResult)[] ): Promise { const result = (seq as any)(...fns); return result.unwrapOrThrow(); } }