1 | import { IterationOf } from '../Iteration/IterationOf';
|
---|
2 | import { Iteration } from '../Iteration/Iteration';
|
---|
3 | import { Pos } from '../Iteration/Pos';
|
---|
4 | import { Prev } from '../Iteration/Prev';
|
---|
5 | import { Next } from '../Iteration/Next';
|
---|
6 | import { _IsNegative } from './IsNegative';
|
---|
7 | import { Cast } from '../Any/Cast';
|
---|
8 | /**
|
---|
9 | * @hidden
|
---|
10 | */
|
---|
11 | declare 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 | */
|
---|
19 | declare type SubPositive<N1 extends Iteration, N2 extends Iteration> = _SubPositive<N1, N2> extends infer X ? Cast<X, Iteration> : never;
|
---|
20 | /**
|
---|
21 | * @hidden
|
---|
22 | */
|
---|
23 | declare 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 | */
|
---|
31 | declare type SubNegative<N1 extends Iteration, N2 extends Iteration> = _SubNegative<N1, N2> extends infer X ? Cast<X, Iteration> : never;
|
---|
32 | /**
|
---|
33 | * @hidden
|
---|
34 | */
|
---|
35 | export 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 | */
|
---|
56 | export declare type Sub<N1 extends number, N2 extends number> = N1 extends unknown ? N2 extends unknown ? _Sub<IterationOf<N1>, IterationOf<N2>>[0] : never : never;
|
---|
57 | export {};
|
---|