import type { List } from "."; // @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"; type _FilterMutableList, TS extends List> = number extends TS["length"] ? TS : TS extends [infer Head, ...infer Tail] ? Call1W extends true ? [Head, ..._FilterMutableList] : _FilterMutableList : []; type _FilterImmutableList, TS extends List> = number extends TS["length"] ? TS : TS extends readonly [infer Head, ...infer Tail] ? Call1W extends true ? readonly [Head, ..._FilterImmutableList] : _FilterImmutableList : readonly []; /** * Filter a {@link List} (i.e., fixed-length tuple) based on a predicate. * * Sig: `(pred: (x: T => boolean), xs: List) => List` * * @see {@link Reject} for the opposite. */ export type Filter, TS extends List> = TS extends unknown[] ? _FilterMutableList : _FilterImmutableList; interface Resolver extends GenericResolver<[Fn1, List], List> { on1_: ([pred]: Args) => [[List>], List>]; on_1: ([, xs]: Args) => [[Fn1<(typeof xs)[number], boolean>], List<(typeof xs)[number]>]; on11: ([pred, xs]: Args) => [[], List<(typeof xs)[number]>]; } /** * [Fn] Filter a {@link List} (i.e., fixed-length tuple) based on a predicate. * * Sig: `(pred: (x: T => boolean), xs: List) => List` * * @see {@link RejectFn} for the opposite. */ export default interface FilterFn extends GenericFn { def: ([pred, xs]: Args) => Filter; }