// 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 async function seq< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, ): AsyncResult; // prettier-ignore export async 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 async 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 async function seq( ...fns: ((...args: any[]) => AsyncResult)[] ): AsyncResult { let result = await fns[0]!(); for (let i = 1; i < fns.length; i++) { if (result.isError()) { return result; } result = await fns[i]!(result.unwrapOrThrow()); } return result; } // prettier-ignore export async function seqUNSAFE< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, ): Promise; // prettier-ignore export async function seqUNSAFE< T1, TE1 extends TaggedError, T2, TE2 extends TaggedError, T3, TE3 extends TaggedError, >( fn1: () => AsyncResult, fn2: (value: T1) => AsyncResult, fn3: (value: T2) => AsyncResult, ): Promise; export async function seqUNSAFE( ...fns: ((...args: any[]) => AsyncResult)[] ): Promise { const result = await (seq as any)(...fns); if (result.isError()) { throw result.unwrapOrThrow(); } return result.unwrapOrThrow(); } export async function UNSAFE( fn: () => AsyncResult, ): Promise { return (await fn()).unwrapOrThrow(); } }