rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
39 lines (35 loc) • 1.17 kB
TypeScript
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>;
}