rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
37 lines (33 loc) • 1.18 kB
TypeScript
// @ts-ignore - Only used in doc comments
import type { Filter } from "./Filter";
// @ts-ignore - Only used in doc comments
import type FilterFn from "./Filter";
import type { Args, Call1W, Fn1, GenericFn, GenericResolver, Param0 } from "../HKT";
/**
* Keep elements of a union that do not satisfy a predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, u: UnionOf<T>) => UnionOf<T>`
*
* @see {@link Filter} for the opposite.
*/
export type Reject<Pred extends Fn1<never, boolean>, U> =
U extends U ?
Call1W<Pred, U> extends false ?
U
: never
: never;
interface Resolver extends GenericResolver<[Fn1<never, boolean>, unknown], unknown> {
on1_: ([pred]: Args<this>) => [[Param0<typeof pred>], Param0<typeof pred>];
on_1: ([, u]: Args<this>) => [[Fn1<typeof u, boolean>], typeof u];
on11: ([pred, u]: Args<this>) => [[], typeof u];
}
/**
* [Fn] Keep elements of a union that do not satisfy a predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, u: UnionOf<T>) => UnionOf<T>`
*
* @see {@link FilterFn} for the opposite.
*/
export default interface RejectFn extends GenericFn<Resolver> {
def: ([pred, u]: Args<this>) => Reject<typeof pred, typeof u>;
}