Hyperlinkv0.8.0-beta.28

Stream

Stream.catchTagconsteffect/Stream.ts:5273
<
  const K extends Tags<E> | Arr.NonEmptyReadonlyArray<Tags<E>>,
  E,
  A1,
  E1,
  R1,
  A2 = unassigned,
  E2 = never,
  R2 = never
>(
  k: K,
  f: (
    e: ExtractTag<
      NoInfer<E>,
      K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
    >
  ) => Stream<A1, E1, R1>,
  orElse?:
    | ((
        e: ExcludeTag<
          E,
          K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
        >
      ) => Stream<A2, E2, R2>)
    | undefined
): <A, R>(
  self: Stream<A, E, R>
) => Stream<
  A | A1 | Exclude<A2, unassigned>,
  | E1
  | E2
  | (A2 extends unassigned
      ? ExcludeTag<
          E,
          K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
        >
      : never),
  R | R1 | R2
>
<
  A,
  E,
  R,
  const K extends Tags<E> | Arr.NonEmptyReadonlyArray<Tags<E>>,
  R1,
  E1,
  A1,
  A2 = unassigned,
  E2 = never,
  R2 = never
>(
  self: Stream<A, E, R>,
  k: K,
  f: (
    e: ExtractTag<
      E,
      K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
    >
  ) => Stream<A1, E1, R1>,
  orElse?:
    | ((
        e: ExcludeTag<
          E,
          K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
        >
      ) => Stream<A2, E2, R2>)
    | undefined
): Stream<
  A | A1 | Exclude<A2, unassigned>,
  | E1
  | E2
  | (A2 extends unassigned
      ? ExcludeTag<
          E,
          K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K
        >
      : never),
  R | R1 | R2
>

Recovers from failures whose _tag matches the provided value by switching to the stream returned by f.

When to use

Use when you need to handle a specific error case from a stream whose error type is a tagged union with a readonly _tag field.

Example (Catching tagged failures)

import { Console, Data, Effect, Stream } from "effect"

class HttpError extends Data.TaggedError("HttpError")<{ message: string }> {}

const stream = Stream.fail(new HttpError({ message: "timeout" }))

const recovered = Stream.catchTag(stream, "HttpError", (error) =>
  Stream.make(`Recovered: ${error.message}`)
)

const program = Effect.gen(function*() {
  const values = yield* Stream.runCollect(recovered)
  yield* Console.log(values)
  // Output: [ "Recovered: timeout" ]
})

Effect.runPromise(program)
error handling
Source effect/Stream.ts:527379 lines
export const catchTag: {
  <
    const K extends Tags<E> | Arr.NonEmptyReadonlyArray<Tags<E>>,
    E,
    A1,
    E1,
    R1,
    A2 = unassigned,
    E2 = never,
    R2 = never
  >(
    k: K,
    f: (
      e: ExtractTag<NoInfer<E>, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>
    ) => Stream<A1, E1, R1>,
    orElse?:
      | ((e: ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>) => Stream<A2, E2, R2>)
      | undefined
  ): <A, R>(
    self: Stream<A, E, R>
  ) => Stream<
    A | A1 | Exclude<A2, unassigned>,
    | E1
    | E2
    | (A2 extends unassigned ? ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K> : never),
    R | R1 | R2
  >
  <
    A,
    E,
    R,
    const K extends Tags<E> | Arr.NonEmptyReadonlyArray<Tags<E>>,
    R1,
    E1,
    A1,
    A2 = unassigned,
    E2 = never,
    R2 = never
  >(
    self: Stream<A, E, R>,
    k: K,
    f: (e: ExtractTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>) => Stream<A1, E1, R1>,
    orElse?:
      | ((e: ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>) => Stream<A2, E2, R2>)
      | undefined
  ): Stream<
    A | A1 | Exclude<A2, unassigned>,
    | E1
    | E2
    | (A2 extends unassigned ? ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K> : never),
    R | R1 | R2
  >
} = dual(
  (args) => isStream(args[0]),
  <
    A,
    E,
    R,
    const K extends Tags<E> | Arr.NonEmptyReadonlyArray<Tags<E>>,
    R1,
    E1,
    A1,
    A2 = never,
    E2 = ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>,
    R2 = never
  >(
    self: Stream<A, E, R>,
    k: K,
    f: (e: ExtractTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>) => Stream<A1, E1, R1>,
    orElse?:
      | ((e: ExcludeTag<E, K extends Arr.NonEmptyReadonlyArray<string> ? K[number] : K>) => Stream<A2, E2, R2>)
      | undefined
  ): Stream<A1 | A | A2, E1 | E2, R1 | R | R2> => {
    const pred = Array.isArray(k)
      ? ((e: E): e is any => hasProperty(e, "_tag") && k.includes(e._tag))
      : isTagged(k as string)
    return catchIf(self, pred, f, orElse as any) as any
  }
)