// ets_tracing: off import { succeed } from "./core.js" import type { Effect } from "./effect.js" import { fail } from "./fail.js" import { foldM_ } from "./foldM.js" /** * Recovers from all errors. */ export function catchAll_( effect: Effect, f: (e: E2) => Effect, __trace?: string ) { return foldM_(effect, f, succeed, __trace) } /** * Recovers from all errors. * * @ets_data_first catchAll_ */ export function catchAll(f: (e: E2) => Effect, __trace?: string) { return (effect: Effect) => catchAll_(effect, f, __trace) } /** * Recovers from specified error. * * @ets_data_first catch_ */ function _catch( tag: N, k: K, f: (e: Extract) => Effect, __trace?: string ) { return ( self: Effect ): Effect | E1, A | A1> => catchAll_( self, (e) => { if (tag in e && e[tag] === k) { return f(e as any) } return fail(e as any) }, __trace ) } /** * Recovers from specified error. */ export function catch_( self: Effect, tag: N, k: K, f: (e: Extract) => Effect, __trace?: string ): Effect | E1, A | A1> { return catchAll_( self, (e) => { if (tag in e && e[tag] === k) { return f(e as any) } return fail(e as any) }, __trace ) } /** * Recovers from specified error. * * @ets_data_first catchTag_ */ export function catchTag< K extends E["_tag"] & string, E extends { _tag: string }, R1, E1, A1 >(k: K, f: (e: Extract) => Effect, __trace?: string) { return ( self: Effect ): Effect | E1, A | A1> => catchTag_(self, k, f, __trace) } /** * Recovers from specified error. */ export function catchTag_< K extends E["_tag"] & string, E extends { _tag: string }, R, A, R1, E1, A1 >( self: Effect, k: K, f: (e: Extract) => Effect, __trace?: string ): Effect | E1, A | A1> { return catchAll_( self, (e) => { if ("_tag" in e && e["_tag"] === k) { return f(e as any) } return fail(e as any) }, __trace ) } export { _catch as catch }