@@ -51,24 +51,21 @@ export type Subtract<A extends number, B extends number> =
5151 : SubtractPostChecks < A , B > ;
5252
5353// When we get here, A and B are not equal and neither of them are 0, +/- infinity or the "number" type
54- type SubtractPostChecks < A extends number , B extends number , Depth extends number = 20 , AreNegative = [ IsNegative < A > , IsNegative < B > ] > =
55- // Depth & DepthCounter are used to prevent infinite recursion (issue on TS < 5.4.0)
56- Depth extends never
57- ? never
58- : AreNegative extends [ false , false ]
59- ? LessThan < A , B > extends true
54+ type SubtractPostChecks < A extends number , B extends number , AreNegative = [ IsNegative < A > , IsNegative < B > ] > =
55+ AreNegative extends [ false , false ]
56+ ? LessThan < A , B > extends true
6057 // When A < B we can reverse the result of B - A
61- ? ReverseSign < SubtractPostChecks < B , A , DepthCounter [ Depth ] > >
58+ ? ReverseSign < SubtractPostChecks < B , A > >
6259 // Both numbers are positive and A > B - this is where we always want to end up and do the actual subtraction
63- : BuildTuple < A > extends [ ...BuildTuple < B > , ...infer R ]
64- ? R [ 'length' ]
65- : never
66- : AreNegative extends [ true , true ]
67- // When both numbers are negative we subtract the absolute values and then reverse the sign
68- ? ReverseSign < SubtractPostChecks < NumberAbsolute < A > , NumberAbsolute < B > , DepthCounter [ Depth ] > >
69- // When the signs are different we can add the absolute values and then reverse the sign if A < B
70- : [ ... BuildTuple < NumberAbsolute < A > > , ... BuildTuple < NumberAbsolute < B > > ] extends infer R extends unknown [ ]
71- ? LessThan < A , B > extends true ? ReverseSign < R [ 'length' ] > : R [ 'length' ]
72- : never ;
73-
74- type DepthCounter = [ never , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , ... Array < 0 > ] ;
60+ : BuildTuple < A > extends [ ...BuildTuple < B > , ...infer R ]
61+ ? R [ 'length' ]
62+ : never
63+ : AreNegative extends [ true , true ]
64+ // When both numbers are negative we subtract the absolute values and then reverse the sign
65+ ? SubtractPostChecks < NumberAbsolute < A > , NumberAbsolute < B > > extends infer Result extends number
66+ ? ReverseSign < Result >
67+ : never
68+ // When the signs are different we can add the absolute values and then reverse the sign if A < B
69+ : [ ... BuildTuple < NumberAbsolute < A > > , ... BuildTuple < NumberAbsolute < B > > ] extends infer R extends unknown [ ]
70+ ? LessThan < A , B > extends true ? ReverseSign < R [ 'length' ] > : R [ 'length' ]
71+ : never ;
0 commit comments