UNPKG

@effect-ts/system

Version:

Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.

124 lines (115 loc) 2.59 kB
// 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_<R2, E2, A2, R, E, A>( effect: Effect<R2, E2, A2>, f: (e: E2) => Effect<R, E, A>, __trace?: string ) { return foldM_(effect, f, succeed, __trace) } /** * Recovers from all errors. * * @ets_data_first catchAll_ */ export function catchAll<R, E, E2, A>(f: (e: E2) => Effect<R, E, A>, __trace?: string) { return <R2, A2>(effect: Effect<R2, E2, A2>) => catchAll_(effect, f, __trace) } /** * Recovers from specified error. * * @ets_data_first catch_ */ function _catch<N extends keyof E, K extends E[N] & string, E, R1, E1, A1>( tag: N, k: K, f: (e: Extract<E, { [n in N]: K }>) => Effect<R1, E1, A1>, __trace?: string ) { return <R, A>( self: Effect<R, E, A> ): Effect<R & R1, Exclude<E, { [n in N]: K }> | 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_<N extends keyof E, K extends E[N] & string, E, R, A, R1, E1, A1>( self: Effect<R, E, A>, tag: N, k: K, f: (e: Extract<E, { [n in N]: K }>) => Effect<R1, E1, A1>, __trace?: string ): Effect<R & R1, Exclude<E, { [n in N]: K }> | 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<E, { _tag: K }>) => Effect<R1, E1, A1>, __trace?: string) { return <R, A>( self: Effect<R, E, A> ): Effect<R & R1, Exclude<E, { _tag: K }> | 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<R, E, A>, k: K, f: (e: Extract<E, { _tag: K }>) => Effect<R1, E1, A1>, __trace?: string ): Effect<R & R1, Exclude<E, { _tag: K }> | 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 }