import type {NumberAbsolute, BuildTuple, TupleMax, TupleMin} from './internal'; import type {IsEqual} from './is-equal'; import type {PositiveInfinity, NegativeInfinity, IsNegative} from './numeric'; import type {Subtract} from './subtract'; import type {And} from './and'; import type {Or} from './or'; /** Returns the sum of two numbers. Note: - A or B can only support `-999` ~ `999`. - A and B can only be small integers, less than 1000. - If the result is negative, you can only get `number`. @example ``` import type {Sum} from 'type-fest'; Sum<111, 222>; //=> 333 Sum<-111, 222>; //=> 111 Sum<111, -222>; //=> number Sum; //=> PositiveInfinity Sum; //=> number ``` @category Numeric */ // TODO: Support big integer and negative number. export type Sum = number extends A | B ? number : [ IsEqual, IsEqual, IsEqual, IsEqual, ] extends infer R extends [boolean, boolean, boolean, boolean] ? Or< And, IsEqual>, And, IsEqual> > extends true ? PositiveInfinity : Or< And, IsEqual>, And, IsEqual> > extends true ? NegativeInfinity : true extends R[number] ? number : ([IsNegative, IsNegative] extends infer R ? [false, false] extends R ? [...BuildTuple, ...BuildTuple]['length'] : [true, true] extends R ? number : TupleMax<[NumberAbsolute, NumberAbsolute]> extends infer Max_ ? TupleMin<[NumberAbsolute, NumberAbsolute]> extends infer Min_ extends number ? Max_ extends A | B ? Subtract : number : never : never : never) & number : never;