rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
37 lines (33 loc) • 1.14 kB
TypeScript
// @ts-ignore - Only used in doc comments
import type { Reject } from "./Reject";
// @ts-ignore - Only used in doc comments
import type RejectFn from "./Reject";
import type { Args, Call1W, Fn1, GenericFn, GenericResolver, Param0 } from "../HKT";
/**
* Filter a union based on a predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, u: UnionOf<T>) => UnionOf<T>`
*
* @see {@link Reject} for the opposite.
*/
export type Filter<Pred extends Fn1<never, boolean>, U> =
U extends U ?
Call1W<Pred, U> extends true ?
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] Filter a union based on a predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, u: UnionOf<T>) => UnionOf<T>`
*
* @see {@link RejectFn} for the opposite.
*/
export default interface FilterFn extends GenericFn<Resolver> {
def: ([pred, u]: Args<this>) => Filter<typeof pred, typeof u>;
}