import type {NumberAbsolute, BuildTuple} from './internal'; import type {IsEqual} from './is-equal'; import type {PositiveInfinity, NegativeInfinity, IsNegative} from './numeric'; import type {LessThan} from './less-than'; import type {Sum} from './sum'; import type {And} from './and'; import type {Or} from './or'; /** Returns the difference between two numbers. Note: - A or B can only support `-999` ~ `999`. - If the result is negative, you can only get `number`. @example ``` import type {Subtract} from 'type-fest'; Subtract<333, 222>; //=> 111 Subtract<111, -222>; //=> 333 Subtract<-111, 222>; //=> number Subtract; //=> PositiveInfinity Subtract; //=> number ``` @category Numeric */ // TODO: Support big integer and negative number. export type Subtract = 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 extends infer R ? R extends [...BuildTuple, ...infer R] ? R['length'] : number : never : LessThan extends true ? number : [false, true] extends R ? Sum> : Subtract, NumberAbsolute> : never : never;