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));
});
}