export type AnyFn = (...args: any[]) => any; export type Head = T extends [any, ...any[]] ? T[0] : never; export type HasTail = T extends [] | [any] ? false : true; export type Last = { 0: Last>; 1: Head; }[HasTail extends true ? 0 : 1]; export type Tail = T extends [any, ...infer Rest] ? Rest : []; export type Length = T["length"]; export type Prepend = [E] extends [never] ? T : [E, ...T]; export type Drop = { 0: Drop, Prepend>; 1: T; }[Length extends N ? 1 : 0]; export type Cast = X extends Y ? X : Y; export type Pos = Length; export type Next = Prepend; export type Prev = Tail; export type Iterator = { 0: Iterator, Next>; 1: From; }[Pos extends Index ? 1 : 0]; export type Reverse = { 0: Reverse], R>, Next>; 1: R; }[Length extends Pos ? 1 : 0]; export type Concat = T extends any[] ? U extends any[] ? [...T, ...U] : [...T, U] : U extends any[] ? [T, ...U] : [T, U]; export type Append = Concat;