export { Int, Cardinal as Natural, Prev, Next, Subtract }; type Int = T extends `${infer I extends number}` ? I : T & number; type Next = number & _Next[I & number]; interface _Next extends Numeric, __Next { } type __Next = Omit; type Prev = number & _Prev[I & number]; interface _Prev extends Numeric, __Prev { } type __Prev = Omit<[never, ...Cardinal], ArrayKeys>; type Natural = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64]; type Cardinal = [0, ...Natural]; interface Numeric { [k: number]: number; } type Subtract = number extends A ? number : number extends B ? number : _Subtract; type _Subtract, _B = Prev> = B extends 0 ? A : [_A] extends [never] ? never : [_B] extends never ? never : _Subtract<_A & number, _B & number>; export { Mappable, OptionalKeys, ReverseMap }; type Mappable = { [k: PropertyKey]: T | undefined; } | readonly (T | undefined)[]; type OptionalKeys = { [K in keyof T as K extends ArrayKeys ? number extends K ? never : K extends number ? K : never : K]-?: {} extends { [P in K]: T[P]; } ? K : never; } extends infer U ? U[keyof U] : never; type ReverseMap = { [K in keyof T as T[K]]: K; }; export { ArrayLike, Indexable, ArrayKeys, Slice, ToTuple, Tuple, NumericKeys, Head, Tail, Last, Init, IsOptional, GetRest }; type ArrayKeys = Exclude; type ArrayLike = { [k: number]: any; length: any; }; type Indexable = { [k: number]: any; }; type Slice['length'] : number, R extends any[] = [], Optional = Int>> = number extends To ? SliceOpenEnded : SliceOptional; type SliceOpenEnded = I extends 0 ? T : T extends [unknown, ...infer R] ? SliceOpenEnded> : never; type SliceOptional = I extends To ? R : SliceOptional, To, I extends Optional ? [...R, T[I & number]?] : [...R, T[I & number]], Optional>; type IsOptional = (T['length'] extends infer L ? L extends I ? true : false : never) extends false ? false : true; type NumericKeys = Int>; type ExcludeNumber = T extends any ? number extends T ? never : T : never; type ToTuple, Optionals = Int>, I extends number = 0, R extends unknown[] = []> = [Keys] extends [never] ? R : ToTuple, Optionals, Next, I extends Optionals ? [...R, T[I]?] : [...R, T[I]]>; type GetRest = T extends [...U, ...infer Rest] ? Rest : []; type Tuple = R['length'] extends L ? R : Tuple; type Head = T[0]; type Tail = T extends [unknown, ...infer R] ? R : never; type Last = T[Prev]; type Init = T extends [...infer R, unknown] ? R : never; export { Eq, IsUnknown, IsAny, UnknownToAny, PickUnionMember, Union2Tuple }; type IsUnknown = unknown extends T ? IsAny extends false ? true : false : false; type IsAny = [T | anything] extends [T & anything] ? true : false; type UnknownToAny = unknown extends T ? any : T; type Eq = [A] extends [B] ? [B] extends [A] ? true : false : false; declare const thing: unique symbol; type anything = typeof thing; type PickUnionMember T) => void : never, Overloads = [HOFs] extends [(a: infer I) => any] ? I : never> = Overloads extends () => (infer R) ? R : never; type Union2Tuple> = [ U ] extends [never] ? [] : [...Union2Tuple>, T];