import { Cause, Effect, Exit, Option } from "effect"; export function toError(cause: unknown): Error { return cause instanceof Error ? cause : new Error(String(cause)); } export function trySync(try_: () => A): Effect.Effect { return Effect.try({ try: try_, catch: toError }); } export function tryPromise( try_: () => PromiseLike, ): Effect.Effect { return Effect.tryPromise({ try: try_, catch: (cause) => cause, }); } export function runEffectPromise( effect: Effect.Effect, ): Promise { return Effect.runPromiseExit(effect).then((exit) => { if (Exit.isSuccess(exit)) return exit.value; throw effectExitError(exit); }); } export function effectExitError(exit: Exit.Exit): E | Error { if (Exit.isSuccess(exit)) { return new Error("Effect completed successfully"); } const failure = Cause.failureOption(exit.cause); if (Option.isSome(failure)) return failure.value; const squashed = Cause.squash(exit.cause); return squashed instanceof Error ? squashed : new Error(String(squashed)); } export function runEffectBackground( effect: Effect.Effect, handlers: { onSuccess: (value: A) => void; onFailure: (error: E | Error) => void; }, ) { void Effect.runPromiseExit(effect).then((exit) => { if (Exit.isSuccess(exit)) { handlers.onSuccess(exit.value); return; } handlers.onFailure(effectExitError(exit)); }); }