// Utility types type Length = T extends { length: infer L } ? L : never; type BuildTuple = T extends { length: L } ? T : BuildTuple; type MultiAdd = I extends 0 ? A : Add extends number ? MultiAdd, Subtract> : never; type AtTerminus = A extends 0 ? true : (B extends 0 ? true : false); type EQ = A extends B ? (B extends A ? true : false) : false; type LT = AtTerminus extends true ? EQ extends true ? false : (A extends 0 ? true : false) : LT, Subtract>; type MultiSub = LT extends true ? Q : Add extends number ? MultiSub, D, Add> : never; type IsPositive = `${N}` extends `-${number}` ? false : true; type IsWhole = `${N}` extends `${number}.${number}` ? false : true; type IsValid = IsPositive extends true ? (IsWhole extends true ? true : false) : false; type AreValid = IsValid extends true ? (IsValid extends true ? true : false) : false; // Arithmetical types type Add = Length<[...BuildTuple, ...BuildTuple]>; type Subtract = BuildTuple extends [...(infer U), ...BuildTuple] ? Length : never; type Multiply = MultiAdd; type Divide = MultiSub; type Modulo = LT extends true ? A : Modulo, B>; // Safeguarded arithmetical types type SafeAdd = AreValid extends true ? Add : never; type SafeSubtract = AreValid extends true ? Subtract : never; type SafeMultiply = AreValid extends true ? Multiply : never; type SafeDivide = AreValid extends true ? Divide : never; type SafeModulo = AreValid extends true ? Modulo : never;