Hyperlinkv0.8.0-beta.28

Stream

Stream.catchIfconsteffect/Stream.ts:5124
<E, EB extends E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
  refinement: Refinement<NoInfer<E>, EB>,
  f: (e: EB) => Stream<A2, E2, R2>,
  orElse?: ((e: Exclude<E, EB>) => Stream<A3, E3, R3>) | undefined
): <A, R>(
  self: Stream<A, E, R>
) => Stream<
  A | A2 | Exclude<A3, unassigned>,
  E2 | E3 | (A3 extends unassigned ? Exclude<E, EB> : never),
  R | R2 | R3
>
<E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
  predicate: Predicate<NoInfer<E>>,
  f: (e: NoInfer<E>) => Stream<A2, E2, R2>,
  orElse?: ((e: NoInfer<E>) => Stream<A3, E3, R3>) | undefined
): <A, R>(
  self: Stream<A, E, R>
) => Stream<
  A | A2 | Exclude<A3, unassigned>,
  E2 | E3 | (A3 extends unassigned ? E : never),
  R | R2 | R3
>
<
  A,
  E,
  R,
  EB extends E,
  A2,
  E2,
  R2,
  A3 = unassigned,
  E3 = never,
  R3 = never
>(
  self: Stream<A, E, R>,
  refinement: Refinement<E, EB>,
  f: (e: EB) => Stream<A2, E2, R2>,
  orElse?: ((e: Exclude<E, EB>) => Stream<A3, E3, R3>) | undefined
): Stream<
  A | A2 | Exclude<A3, unassigned>,
  E2 | E3 | (A3 extends unassigned ? Exclude<E, EB> : never),
  R | R2 | R3
>
<A, E, R, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
  self: Stream<A, E, R>,
  predicate: Predicate<E>,
  f: (e: E) => Stream<A2, E2, R2>,
  orElse?: ((e: E) => Stream<A3, E3, R3>) | undefined
): Stream<
  A | A2 | Exclude<A3, unassigned>,
  E2 | E3 | (A3 extends unassigned ? E : never),
  R | R2 | R3
>

Recovers from errors that match a predicate by switching to a recovery stream.

Details

When a failure matches the filter, the stream switches to the recovery stream. Non-matching failures propagate downstream, so the error type is preserved unless the filter narrows it.

Example (Catching matching failures)

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

const stream = Stream.make(1, 2).pipe(
  Stream.concat(Stream.fail(42)),
  Stream.catchIf(
    (error): error is 42 => error === 42,
    () => Stream.make(999)
  )
)

const program = Effect.gen(function*() {
  const values = yield* Stream.runCollect(stream)
  yield* Console.log(values)
  // Output: [ 1, 2, 999 ]
})

Effect.runPromise(program)
error handling
Source effect/Stream.ts:512451 lines
export const catchIf: {
  <E, EB extends E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
    refinement: Refinement<NoInfer<E>, EB>,
    f: (e: EB) => Stream<A2, E2, R2>,
    orElse?: ((e: Exclude<E, EB>) => Stream<A3, E3, R3>) | undefined
  ): <A, R>(
    self: Stream<A, E, R>
  ) => Stream<A | A2 | Exclude<A3, unassigned>, E2 | E3 | (A3 extends unassigned ? Exclude<E, EB> : never), R | R2 | R3>
  <E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
    predicate: Predicate<NoInfer<E>>,
    f: (e: NoInfer<E>) => Stream<A2, E2, R2>,
    orElse?: ((e: NoInfer<E>) => Stream<A3, E3, R3>) | undefined
  ): <A, R>(
    self: Stream<A, E, R>
  ) => Stream<A | A2 | Exclude<A3, unassigned>, E2 | E3 | (A3 extends unassigned ? E : never), R | R2 | R3>
  <A, E, R, EB extends E, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
    self: Stream<A, E, R>,
    refinement: Refinement<E, EB>,
    f: (e: EB) => Stream<A2, E2, R2>,
    orElse?: ((e: Exclude<E, EB>) => Stream<A3, E3, R3>) | undefined
  ): Stream<A | A2 | Exclude<A3, unassigned>, E2 | E3 | (A3 extends unassigned ? Exclude<E, EB> : never), R | R2 | R3>
  <A, E, R, A2, E2, R2, A3 = unassigned, E3 = never, R3 = never>(
    self: Stream<A, E, R>,
    predicate: Predicate<E>,
    f: (e: E) => Stream<A2, E2, R2>,
    orElse?: ((e: E) => Stream<A3, E3, R3>) | undefined
  ): Stream<A | A2 | Exclude<A3, unassigned>, E2 | E3 | (A3 extends unassigned ? E : never), R | R2 | R3>
} = dual((args) => isStream(args[0]), <
  A,
  E,
  R,
  A2,
  E2,
  R2,
  A3 = never,
  E3 = E,
  R3 = never
>(
  self: Stream<A, E, R>,
  predicate: Predicate<E>,
  f: (failure: E) => Stream<A2, E2, R2>,
  orElse?: ((failure: E) => Stream<A3, E3, R3>) | undefined
): Stream<A | A2 | A3, E2 | E3, R | R2 | R3> =>
  fromChannel(
    Channel.catchIf(
      toChannel(self),
      predicate,
      (e) => f(e).channel,
      orElse && ((e) => orElse(e).channel)
    )
  ))
Referenced by 1 symbols