export type ToNumber = T extends `${infer N extends number | bigint}` ? N : never; export type ToString = `${T}`; export type Digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; export type Digit = Digits[number]; export type DigitNumber = { sign: "-" | ""; num: Digit[]; }; export type MakeDigitNumber = { sign: S; num: N; }; export type ToDigits = T extends `${infer N extends Digit}${infer R}` ? ToDigits : Acc; export type ToDigitNumber = T extends `-${infer R}` ? { sign: "-"; num: ToDigits; } : { sign: ""; num: ToDigits; }; export type FromDigits = T extends [ infer N extends Digit, ...infer R ] ? FromDigits : Acc; export type Sign = T["sign"]; export type InvertSign = Sign extends "-" ? "" : "-"; export type MulSign = S1 extends "-" ? S2 extends "-" ? "" : "-" : S2 extends "-" ? "-" : ""; export type Num = T["num"]; export type FromDigitNumber = `${Sign}${FromDigits>}`; export type TrimZeros = T extends [0] ? [0] : T extends [0, ...infer R extends Digit[]] ? TrimZeros : T; export type Normalize>> = Trim extends [0] ? MakeDigitNumber<"", Trim> : MakeDigitNumber, Trim>;