,
Fn extends (_: Extract>, ...args: Args) => Ret
>(
...pattern: [
first: P,
...values: Array,
f: Fn
]
) => (
self: Matcher
) => Matcher<
I,
Types.AddWithout>>,
Types.ApplyFilters>>>,
ReturnType | A,
Pr,
Ret,
Args
> = discriminator("_tag") as any
/** @internal */
export const tagStartsWith = discriminatorStartsWith("_tag")
/** @internal */
export const tags = discriminators("_tag")
/** @internal */
export const tagsExhaustive = discriminatorsExhaustive("_tag")
/** @internal */
export const not = <
R,
const P extends Types.PatternPrimitive | Types.PatternBase,
Ret,
Args extends Array,
Fn extends (_: Types.NotMatch, ...args: Args) => Ret
>(
pattern: P,
f: Fn
) =>
(
self: Matcher
): Matcher<
I,
Types.AddOnly>,
Types.ApplyFilters>>,
A | ReturnType,
Pr,
Ret,
Args
> => (self as any).add(makeNot(makePredicate(pattern), f as any))
/** @internal */
export const nonEmptyString: SafeRefinement =
((u: unknown) => typeof u === "string" && u.length > 0) as any
/** @internal */
export const is: <
Literals extends ReadonlyArray
>(
...literals: Literals
) => SafeRefinement = (...literals): any => {
const len = literals.length
return (u: unknown) => {
for (let i = 0; i < len; i++) {
if (u === literals[i]) {
return true
}
}
return false
}
}
/** @internal */
export const any: SafeRefinement = (() => true) as any
/** @internal */
export const defined = (u: A): u is A & {} => (u !== undefined && u !== null) as any
/** @internal */
export const instanceOf = any>(
constructor: A
): SafeRefinement, never> => ((u: unknown) => u instanceof constructor) as any
/** @internal */
export const orElse =
, F extends (_: RA, ...args: Args) => Ret>(f: F) =>
(
self: Matcher
): [Pr] extends [never] ? [Args] extends [[]] ? (input: I) => Unify | A>
: (...args: Args) => Unify | A>
: Unify | A> =>
{
const toResult = result(self)
if (Result.isResult(toResult)) {
return toResult._tag === "Success" ? toResult.success as any : (f as any)(toResult.failure)
}
// @ts-expect-error
return (...args: Array) => {
const a = (toResult as any)(...args)
return Result.isSuccess(a) ? a.success : (f as any)(a.failure, ...args)
}
}
/** @internal */
export const orElseAbsurd: >(
self: Matcher
// oxlint-disable-next-line max-len
) => [Pr] extends [never] ? [Args] extends [[]] ? (input: I) => Unify : (...args: Args) => Unify : Unify = ((
self: Matcher
) =>
orElse(
(() => {
throw new Error("effect/Match/orElseAbsurd: absurd")
}) as any
)(self)) as any
/** @internal */
export const result: >(
self: Matcher
) => [Pr] extends [never] ? [Args] extends [[]] ? (input: I) => Result.Result, R>
: (...args: Args) => Result.Result, R>
: Result.Result, R> = ((self: Matcher) => {
if (self._tag === "ValueMatcher") {
return self.value
}
const len = self.cases.length
if (len === 1) {
const _case = self.cases[0]
return (...args: Array): Result.Result => {
const input = self.select(...args)
if (_case._tag === "When" && _case.guard(input) === true) {
return Result.succeed(_case.evaluate(input, ...args))
} else if (_case._tag === "Not" && _case.guard(input) === false) {
return Result.succeed(_case.evaluate(input, ...args))
}
return Result.fail(input as any)
}
}
return (...args: Array): Result.Result => {
const input = self.select(...args)
for (let i = 0; i < len; i++) {
const _case = self.cases[i]
if (_case._tag === "When" && _case.guard(input) === true) {
return Result.succeed(_case.evaluate(input, ...args))
} else if (_case._tag === "Not" && _case.guard(input) === false) {
return Result.succeed(_case.evaluate(input, ...args))
}
}
return Result.fail(input as any)
}
}) as any
/** @internal */
export const option: >(
self: Matcher
) => [Pr] extends [never] ? [Args] extends [[]] ? (input: I) => Option.Option>
: (...args: Args) => Option.Option>
: Option.Option> = ((self: Matcher) => {
const toResult = result(self)
if (Result.isResult(toResult)) {
return Result.match(toResult, {
onFailure: () => Option.none(),
onSuccess: Option.some
})
}
return (...args: Array): Option.Option =>
Result.match((toResult as any)(...args), {
onFailure: () => Option.none(),
onSuccess: Option.some as any
})
}) as any
const getExhaustiveAbsurdErrorMessage = "effect/match/Match/exhaustive: absurd"
/** @internal */
export const exhaustive: >(
self: Matcher
) => [Pr] extends [never] ? [Args] extends [[]] ? (u: I) => Unify : (...args: Args) => Unify
: Unify = ((
self: Matcher
) => {
const toResult = result(self as any)
if (Result.isResult(toResult)) {
if (Result.isSuccess(toResult)) {
return toResult.success
}
throw new Error(getExhaustiveAbsurdErrorMessage)
}
return (...args: Array): A => {
// @ts-expect-error
const result = toResult(...args)
if (Result.isSuccess(result)) {
return result.success as any
}
throw new Error(getExhaustiveAbsurdErrorMessage)
}
}) as any