// 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
)
}