// ets_tracing: off import { RuntimeError } from "../Cause/index.js" import type { Predicate, Refinement } from "../Function/index.js" import { pipe } from "../Function/index.js" import { chain_, succeed, suspend } from "./core.js" import { die } from "./die.js" import type { Effect } from "./effect.js" import { fail } from "./fail.js" /** * Dies with specified `unknown` if the predicate fails. * * @ets_data_first filterOrDie_ */ export function filterOrDie( p: Refinement, dieWith: (a: Exclude) => unknown, __trace?: string ): (fa: Effect) => Effect export function filterOrDie( p: Predicate, dieWith: (a: A) => unknown, __trace?: string ): (fa: Effect) => Effect export function filterOrDie(p: Predicate, dieWith: unknown, __trace?: string) { return (fa: Effect): Effect => filterOrDie_(fa, p, dieWith as (a: A) => unknown, __trace) } /** * Dies with specified `unknown` if the predicate fails. */ export function filterOrDie_( fa: Effect, p: Refinement, dieWith: (a: Exclude) => unknown, __trace?: string ): Effect export function filterOrDie_( fa: Effect, p: Predicate, dieWith: (a: A) => unknown, __trace?: string ): Effect export function filterOrDie_( fa: Effect, p: Predicate, dieWith: unknown, __trace?: string ) { return filterOrElse_( fa, p, (x) => pipe(x, dieWith as (a: A) => unknown, die), __trace ) } /** * Fails with `failWith` if the predicate fails. * * @ets_data_first filterOrFail_ */ export function filterOrFail( p: Refinement, failWith: (a: Exclude) => E1, __trace?: string ): (fa: Effect) => Effect export function filterOrFail( p: Predicate, failWith: (a: A) => E1, __trace?: string ): (fa: Effect) => Effect export function filterOrFail( p: Predicate, failWith: unknown, __trace?: string ) { return (fa: Effect): Effect => filterOrFail_(fa, p, failWith as (a: A) => E1, __trace) } /** * Fails with `failWith` if the predicate fails. */ export function filterOrFail_( fa: Effect, p: Refinement, failWith: (a: Exclude) => E1, __trace?: string ): Effect export function filterOrFail_( fa: Effect, p: Predicate, failWith: (a: A) => E1, __trace?: string ): Effect export function filterOrFail_( fa: Effect, p: Predicate, failWith: unknown, __trace?: string ) { return filterOrElse_(fa, p, (x) => pipe(x, failWith as (a: A) => E1, fail), __trace) } /** * Applies `or` if the predicate fails. * * @ets_data_first filterOrElse_ */ export function filterOrElse( p: Refinement, or: (a: Exclude) => Effect, __trace?: string ): (fa: Effect) => Effect export function filterOrElse( p: Predicate, or: (a: A) => Effect, __trace?: string ): (fa: Effect) => Effect export function filterOrElse( p: Predicate, or: unknown, __trace?: string ) { return (fa: Effect) => filterOrElse_(fa, p, or as (a: A) => Effect, __trace) } /** * Applies `or` if the predicate fails. */ export function filterOrElse_( fa: Effect, p: Refinement, or: (a: Exclude) => Effect, __trace?: string ): Effect export function filterOrElse_( fa: Effect, p: Predicate, or: (a: A) => Effect, __trace?: string ): Effect export function filterOrElse_( fa: Effect, p: Predicate, or: unknown, __trace?: string ): Effect { return chain_( fa, (a): Effect => p(a) ? succeed(a, __trace) : suspend(() => (or as (a: A) => Effect)(a), __trace) ) } /** * Dies with a `Error` having the specified text message * if the predicate fails. * * @ets_data_first filterOrDieMessage_ */ export function filterOrDieMessage( p: Refinement, message: (a: Exclude) => string, __trace?: string ): (fa: Effect) => Effect export function filterOrDieMessage( p: Predicate, message: (a: A) => string, __trace?: string ): (fa: Effect) => Effect export function filterOrDieMessage( p: Predicate, message: unknown, __trace?: string ) { return (fa: Effect): Effect => filterOrDieMessage_(fa, p, message as (a: A) => string, __trace) } /** * Dies with a `Error` having the specified text message * if the predicate fails. */ export function filterOrDieMessage_( fa: Effect, p: Refinement, message: (a: Exclude) => string, __trace?: string ): Effect export function filterOrDieMessage_( fa: Effect, p: Predicate, message: (a: A) => string, __trace?: string ): Effect export function filterOrDieMessage_( fa: Effect, p: Predicate, message: unknown, __trace?: string ) { return filterOrDie_( fa, p, (a) => new RuntimeError((message as (a: A) => string)(a)), __trace ) }