Hyperlinkv0.8.0-beta.28

Effect

Effect.filterOrElseconsteffect/Effect.ts:5055
<A, C, E2, R2, B extends A>(
  refinement: Predicate.Refinement<NoInfer<A>, B>,
  orElse: (
    a: EqualsWith<A, B, NoInfer<A>, Exclude<NoInfer<A>, B>>
  ) => Effect<C, E2, R2>
): <E, R>(self: Effect<A, E, R>) => Effect<B | C, E2 | E, R2 | R>
<A, C, E2, R2>(
  predicate: Predicate.Predicate<NoInfer<A>>,
  orElse: (a: NoInfer<A>) => Effect<C, E2, R2>
): <E, R>(self: Effect<A, E, R>) => Effect<A | C, E2 | E, R2 | R>
<A, E, R, C, E2, R2, B extends A>(
  self: Effect<A, E, R>,
  refinement: Predicate.Refinement<A, B>,
  orElse: (a: EqualsWith<A, B, A, Exclude<A, B>>) => Effect<C, E2, R2>
): Effect<B | C, E | E2, R | R2>
<A, E, R, C, E2, R2>(
  self: Effect<A, E, R>,
  predicate: Predicate.Predicate<NoInfer<A>>,
  orElse: (a: NoInfer<A>) => Effect<C, E2, R2>
): Effect<A | C, E | E2, R | R2>

Filters an effect, providing an alternative effect if the predicate fails.

When to use

Use when a successful value that fails a predicate should continue with an effectful fallback instead of failing the effect.

Details

This function applies a predicate to the result of an effect. If the predicate evaluates to false, it executes the orElse effect instead. The orElse effect can produce an alternative value or perform additional computations.

Example (Filtering with a fallback effect)

import { Effect } from "effect"

// An effect that produces a number
const program = Effect.succeed(5)

// Filter for even numbers, provide alternative for odd numbers
const filtered = Effect.filterOrElse(
  program,
  (n) => n % 2 === 0,
  (n) => Effect.succeed(`Number ${n} is odd`)
)

// Result: "Number 5 is odd" (since 5 is not even)
filtering
Source effect/Effect.ts:505520 lines
export const filterOrElse: {
  <A, C, E2, R2, B extends A>(
    refinement: Predicate.Refinement<NoInfer<A>, B>,
    orElse: (a: EqualsWith<A, B, NoInfer<A>, Exclude<NoInfer<A>, B>>) => Effect<C, E2, R2>
  ): <E, R>(self: Effect<A, E, R>) => Effect<B | C, E2 | E, R2 | R>
  <A, C, E2, R2>(
    predicate: Predicate.Predicate<NoInfer<A>>,
    orElse: (a: NoInfer<A>) => Effect<C, E2, R2>
  ): <E, R>(self: Effect<A, E, R>) => Effect<A | C, E2 | E, R2 | R>
  <A, E, R, C, E2, R2, B extends A>(
    self: Effect<A, E, R>,
    refinement: Predicate.Refinement<A, B>,
    orElse: (a: EqualsWith<A, B, A, Exclude<A, B>>) => Effect<C, E2, R2>
  ): Effect<B | C, E | E2, R | R2>
  <A, E, R, C, E2, R2>(
    self: Effect<A, E, R>,
    predicate: Predicate.Predicate<NoInfer<A>>,
    orElse: (a: NoInfer<A>) => Effect<C, E2, R2>
  ): Effect<A | C, E | E2, R | R2>
} = internal.filterOrElse