rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
32 lines (28 loc) • 1.14 kB
TypeScript
import type { List } from ".";
import type { Args, Call1W, Fn1, GenericFn, GenericResolver, Param0 } from "../HKT";
/**
* Determine if every element in a {@link List} (i.e., fixed-length tuple) satisfies a predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, xs: List<T>) => boolean`
*/
export type Every<Pred extends Fn1<never, boolean>, TS extends List> =
number extends TS["length"] ? boolean
: TS extends readonly [infer Head, ...infer Tail] ?
Call1W<Pred, Head> extends true ?
Every<Pred, Tail>
: false
: true;
interface Resolver extends GenericResolver<[Fn1<never, boolean>, List], boolean> {
on1_: ([pred]: Args<this>) => [[List<Param0<typeof pred>>], boolean];
on_1: ([, xs]: Args<this>) => [[Fn1<(typeof xs)[number], boolean>], boolean];
on11: ([pred, xs]: Args<this>) => [[], boolean];
}
/**
* [Fn] Determine if every element in a {@link List} (i.e., fixed-length tuple) satisfies a
* predicate.
*
* Sig: `<T>(pred: (x: T) => boolean, xs: List<T>) => boolean`
*/
export default interface EveryFn extends GenericFn<Resolver> {
def: ([pred, xs]: Args<this>) => Every<typeof pred, typeof xs>;
}