UNPKG

rivo

Version:

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

36 lines (32 loc) • 1.08 kB
import type { List } from "."; import type { Args, GenericFn, GenericResolver } from "../HKT"; /** * Reverse a {@link List}. * * Sig: `<T>(xs: List<T>) => List<T>` */ export type Reverse<TS extends List> = TS extends unknown[] ? ReverseWritable<TS, []> : ReverseReadonly<TS, readonly []>; type ReverseReadonly<TS extends List, Result extends List> = TS extends readonly [infer Head, ...infer Tail] ? ReverseReadonly<Tail, readonly [Head, ...Result]> : Result; type ReverseWritable<TS extends List, Result extends List> = TS extends readonly [infer Head, ...infer Tail] ? ReverseWritable<Tail, [Head, ...Result]> : Result; interface Resolver extends GenericResolver<[List<unknown>], List<unknown>> { on1: ([xs]: Args<this>) => [ [], typeof xs extends (infer T)[] ? T[] : typeof xs extends readonly (infer T)[] ? readonly T[] : never, ]; } /** * [Fn] Reverse a {@link List}. * * Sig: `<T>(xs: List<T>) => List<T>` */ export default interface ReverseFn extends GenericFn<Resolver> { def: ([xs]: Args<this>) => Reverse<typeof xs>; }