import { UnionToObject } from "../types/index.js"; export type ArrayElement = A extends any[] ? A[number] : A; export type IsEmptyArray = T extends [] ? true : false; export type MaybeArray = T | Array; export type ExtendsArray = T extends any[] ? true : false; export interface FixedLengthArray extends Array { 0: T; length: L; } export type First = T extends [infer F, ...any[]] ? F : never; export type Last = T extends [...any[], infer L] ? L : never; export type Tail = T extends [any, ...infer Rest] ? Rest : never; export type HasTail = T extends [] | [any] ? false : true; /** * Returns passed tuple with added type to the first element * @example * type T = Unshift<1, [2, 3, 4]> * @returns: [1, 2, 3, 4] tuple type * ----------- * @example * type T = Unshift<"potato", ["tomato", "tornado"]> * @returns: ["potato", "tomato", "tornado"] tuple type */ export type Unshift = ((first: E, ...args: T) => any) extends (...args: infer U) => any ? U : T; /** * Returns new tuple with cutting by amount passed * @example * type T = Slice<2, [1, 2, 3, 4]>; * @returns: [3, 4] tuple type * ------------ * @example * type T = Slice<2, ["tomato", "tornado", "potato"]>; * @returns: ["potato"] tuple type */ export type Slice = { 0: Slice, Unshift>; 1: T; }[Length extends Amount ? 1 : 0]; export type Length = T["length"]; export type Position = Length; export type Next = Unshift; export type Prev = Tail; /** * Creates new tuple type based on "Index" and "From" generics * @example * type T1 = Iterator<4>; * @returns: [any, any, any, any] tuple type * ------------ * @example * type T1 = Iterator<4, [any, any]>; * @returns: [any, any, any, any, any, any] tuple type */ export type Iterator = { 0: Iterator, Next>; 1: From; }[Position extends Index ? 1 : 0]; /** * Returns reversed "T" generic tuple with connecting "R" generic tuple * @example * type T = Reverse<[1, 2, 3], [4, 5, 6]>; * @returns: [3, 2, 1, 4, 5, 6] tuple type * ------------ * @example * type T = Reverse<["potato", "tomato", "tornado"], ["Lumbago", "Chicago", "Legato"]>; * @returns: ["tornado", "tomato", "potato", "Lumbago", "Chicago", "Legato"] tuple type */ export type Reverse = { 0: Reverse], R>, Next>; 1: R; }[Position extends Length ? 1 : 0]; /** * Returns joined tuples * @example * type T = Concat<[1, 2, 3], [4, 5, 6]>; * @returns: [1, 2, 3, 4, 5, 6] tuple type * ------------ * @example * type T = Concat<["potato", "tomato", "tornado"], ["Lumbago", "Chicago", "Legato"]>; * @returns: ["potato", "tomato", "tornado", "Lumbago", "Chicago", "Legato"] tuple type */ export type Concat = [...A1, ...A2]; export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; export type LastOf = UnionToIntersection T : never> extends () => infer R ? R : never; export type IsUnionType = 1 extends TuplifyUnion>["length"] ? false : true; export type Split = string extends S ? string[] : S extends "" ? [] : S extends `${infer T}${D}${infer U}` ? [T, ...Split] : [S]; export type Push = [...T, V]; export type TuplifyUnion, N = [T] extends [never] ? true : false> = true extends N ? [] : Push>, L>; export type TupleIntoUnion, S extends string = "."> = T extends [ infer A, ...infer GenericTail ] ? A extends string | number ? GenericTail extends Array ? GenericTail extends [] ? A : `${A}${S}${TupleIntoUnion}` : never : never : never;