import { Schema } from '@effect/schema'
import { Effect } from 'effect'
import { unify } from 'effect/Unify'
export class ErrorA extends Schema.TaggedError<ErrorA>()(
'ErrorA',
{},
) {}
export class ErrorB extends Schema.TaggedError<ErrorB>()(
'ErrorB',
{},
) {}
const program = Effect.suspend(unify(() =>
Math.random() > 0.5
? Effect.fail(new ErrorA())
: Effect.fail(new ErrorB())
))
export const handledOk = program.pipe(
Effect.catchTags({
ErrorA: Effect.die,
ErrorB: error => Effect.succeed(error._tag),
}),
)
export const handleKnownErrors = <A, E, R>(
effect: Effect.Effect<A, E | ErrorA | ErrorB, R>,
) =>
// Type error here
Effect.catchTags(effect, {
ErrorA: Effect.die,
ErrorB: error => Effect.succeed(error._tag),
})
// single error works
export const singleErrorOk = <A, E, R>(
effect: Effect.Effect<A, E | ErrorA, R>,
) =>
Effect.catchTags(effect, {
ErrorA: Effect.die,
})
import { Schema } from '@effect/schema'
import { Effect } from 'effect'
import { unify } from 'effect/Unify'
export class ErrorA extends Schema.TaggedError<ErrorA>()(
'ErrorA',
{},
) {}
export class ErrorB extends Schema.TaggedError<ErrorB>()(
'ErrorB',
{},
) {}
const program = Effect.suspend(unify(() =>
Math.random() > 0.5
? Effect.fail(new ErrorA())
: Effect.fail(new ErrorB())
))
export const handledOk = program.pipe(
Effect.catchTags({
ErrorA: Effect.die,
ErrorB: error => Effect.succeed(error._tag),
}),
)
export const handleKnownErrors = <A, E, R>(
effect: Effect.Effect<A, E | ErrorA | ErrorB, R>,
) =>
// Type error here
Effect.catchTags(effect, {
ErrorA: Effect.die,
ErrorB: error => Effect.succeed(error._tag),
})
// single error works
export const singleErrorOk = <A, E, R>(
effect: Effect.Effect<A, E | ErrorA, R>,
) =>
Effect.catchTags(effect, {
ErrorA: Effect.die,
})