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