UNPKG

wsp-toolkit

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