UNPKG

rivo

Version:

🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.

39 lines (35 loc) • 1.17 kB
import type { List } from "."; import type { Args, GenericFn, GenericResolver } from "../HKT"; import type { Broaden, Eq } from "../helpers"; /** * Check if a {@link List} contains a specific element. * * Sig: `<T>(x: T, xs: List<T>) => boolean` */ export type Contains<T extends TS[number], TS extends List> = unknown extends T ? boolean : number extends TS["length"] ? Eq<T, TS[number]> extends true ? true : boolean : TS extends readonly [infer Head, ...infer Tail] ? Eq<T, Head> extends true ? true : T extends Head ? Contains<T, Tail> extends true ? true : boolean : Contains<T, Tail> : false; interface Resolver extends GenericResolver<[unknown, List], boolean> { on1_: ([x]: Args<this>) => [[List<Broaden<typeof x>>], boolean]; on_1: ([, xs]: Args<this>) => [[Broaden<(typeof xs)[number]>], boolean]; on11: ([x, xs]: Args<this>) => [[], boolean]; } /** * [Fn] Check if a {@link List} contains a specific element. * * Sig: `<T>(x: T, xs: List<T>) => boolean` */ export default interface ContainsFn extends GenericFn<Resolver> { def: ([x, xs]: Args<this>) => Contains<typeof x, typeof xs>; }