UNPKG

1.91 kBTypeScriptView Raw
1import { IterationOf } from '../Iteration/IterationOf';
2import { Iteration } from '../Iteration/Iteration';
3import { Pos } from '../Iteration/Pos';
4import { Prev } from '../Iteration/Prev';
5import { Next } from '../Iteration/Next';
6import { _IsNegative } from './IsNegative';
7import { Cast } from '../Any/Cast';
8/**
9 * @hidden
10 */
11declare type _SubPositive<N1 extends Iteration, N2 extends Iteration> = {
12 0: _SubPositive<Prev<N1>, Prev<N2>>;
13 1: N1;
14 2: number;
15}[Pos<N2> extends 0 ? 1 : number extends Pos<N2> ? 2 : 0];
16/**
17 * @hidden
18 */
19declare type SubPositive<N1 extends Iteration, N2 extends Iteration> = _SubPositive<N1, N2> extends infer X ? Cast<X, Iteration> : never;
20/**
21 * @hidden
22 */
23declare type _SubNegative<N1 extends Iteration, N2 extends Iteration> = {
24 0: _SubNegative<Next<N1>, Next<N2>>;
25 1: N1;
26 2: number;
27}[Pos<N2> extends 0 ? 1 : number extends Pos<N2> ? 2 : 0];
28/**
29 * @hidden
30 */
31declare type SubNegative<N1 extends Iteration, N2 extends Iteration> = _SubNegative<N1, N2> extends infer X ? Cast<X, Iteration> : never;
32/**
33 * @hidden
34 */
35export declare type _Sub<N1 extends Iteration, N2 extends Iteration> = {
36 0: SubPositive<N1, N2>;
37 1: SubNegative<N1, N2>;
38}[_IsNegative<N2>];
39/**
40 * Subtract a [[Number]] from another one
41 * @param N1 Left-hand side
42 * @param N2 Right-hand side
43 * @returns `string | number | boolean`
44 * @example
45 * ```ts
46 * import {N} from 'ts-toolbelt'
47 *
48 * type test0 = N.Sub<'2', '10'> // '-8'
49 * type test1 = N.Sub<'0', '40'> // '-40'
50 * type test2 = N.Sub<'0', '40', 's'> // '-40'
51 * type test3 = N.Sub<'0', '40', 'n'> // -40
52 * type test4 = N.Sub<'-20', '40', 's'> // string
53 * type test5 = N.Sub<'-20', '40', 'n'> // number
54 * ```
55 */
56export declare type Sub<N1 extends number, N2 extends number> = N1 extends unknown ? N2 extends unknown ? _Sub<IterationOf<N1>, IterationOf<N2>>[0] : never : never;
57export {};