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