@machine202502/types 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -0
- package/dist/boolean/boolean.d.ts +13 -0
- package/dist/common/types.d.ts +7 -0
- package/dist/math/index.d.ts +3 -0
- package/dist/math/internal.d.ts +13 -0
- package/dist/number/number.d.ts +19 -0
- package/dist/number-integer/number-integer-arithmetic.d.ts +95 -0
- package/dist/number-integer/number-integer-compare.d.ts +27 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-add.d.ts +222 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-divide.d.ts +13 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-half.d.ts +1522 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-multiply.d.ts +140 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-power.d.ts +6 -0
- package/dist/number-uint-string/number-uint-string-arithmetic-subtract.d.ts +222 -0
- package/dist/number-uint-string/number-uint-string-common.d.ts +2 -0
- package/dist/number-uint-string/number-uint-string-compare.d.ts +117 -0
- package/dist/number-uint-string/number-uint-string-conversion.d.ts +15 -0
- package/dist/number-uint-string/number-uint-string-trim.d.ts +3 -0
- package/dist/number-uint-string/number-uint-string-zarr-maps.d.ts +473 -0
- package/dist/number-uint-string/number-uint-string-zarr.d.ts +19 -0
- package/dist/string/string.d.ts +4 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# @machine202502/types
|
|
2
|
+
|
|
3
|
+
Type-only TypeScript package with **compile-time** integer math and number utilities.
|
|
4
|
+
There is no runtime code — only `.d.ts` declarations.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @machine202502/types
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Requires TypeScript 4.8+ (template literal types / recursive conditional types).
|
|
13
|
+
|
|
14
|
+
## Imports
|
|
15
|
+
|
|
16
|
+
| Entry | Purpose |
|
|
17
|
+
|-------|---------|
|
|
18
|
+
| `@machine202502/types/math` | Public integer/number math types |
|
|
19
|
+
| `@machine202502/types/math/internal` | Lower-level helpers (digit tuples, boolean ops, string utils) |
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import type {
|
|
23
|
+
NumberIntegerAdd,
|
|
24
|
+
NumberIntegerMultiply,
|
|
25
|
+
Trunc,
|
|
26
|
+
IsEven,
|
|
27
|
+
} from "@machine202502/types/math";
|
|
28
|
+
|
|
29
|
+
import type { And, Or, If, NumericalSign } from "@machine202502/types/math/internal";
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## `@machine202502/types/math`
|
|
33
|
+
|
|
34
|
+
### Number helpers
|
|
35
|
+
|
|
36
|
+
| Type | Description |
|
|
37
|
+
|------|-------------|
|
|
38
|
+
| `IsFloat<N>` / `IsInteger<N>` | Whether `N` looks like a float / integer literal |
|
|
39
|
+
| `IsOdd<N>` / `IsEven<N>` | Parity of truncated `N` |
|
|
40
|
+
| `Abs<N>` / `Negate<N>` / `Sign<N>` | Absolute value, negation, sign (`-1 \| 0 \| 1`) |
|
|
41
|
+
| `Signed<N, S>` | Apply sign `S` (or product of two signs) to `Abs<N>` |
|
|
42
|
+
| `Trunc<N>` | Truncate toward zero via string split (drops fractional part) |
|
|
43
|
+
| `NumberParts<N>` | `[sign, fixed, float]` parts of a number literal |
|
|
44
|
+
|
|
45
|
+
### Integer compare
|
|
46
|
+
|
|
47
|
+
| Type | Description |
|
|
48
|
+
|------|-------------|
|
|
49
|
+
| `NumberIntegerCompare<L, R>` | `-1 \| 0 \| 1` |
|
|
50
|
+
| `NumberIntegerEq` / `Neq` / `Gt` / `Gte` / `Lt` / `Lte` | Boolean comparisons |
|
|
51
|
+
| `NumberIntegerMin` / `Max` / `Clamp` | Min, max, clamp (values are truncated) |
|
|
52
|
+
|
|
53
|
+
### Integer arithmetic
|
|
54
|
+
|
|
55
|
+
Operands are truncated to integers. Results are **literal number types**.
|
|
56
|
+
|
|
57
|
+
| Type | Description |
|
|
58
|
+
|------|-------------|
|
|
59
|
+
| `NumberIntegerAdd<L, R>` | `L + R` |
|
|
60
|
+
| `NumberIntegerSubtract<L, R>` | `L - R` |
|
|
61
|
+
| `NumberIntegerMultiply<L, R>` | `L * R` |
|
|
62
|
+
| `NumberIntegerDivide<L, R>` | `[quotient, remainder]` or `null` on divide-by-zero |
|
|
63
|
+
| `NumberIntegerPower<N, P>` | `N ** P` (`null` if `P < 0`) |
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
type A = NumberIntegerAdd<32, NumberIntegerMultiply<11, 11>>; // 153
|
|
67
|
+
type P = NumberIntegerPower<2, 32>; // 4294967296
|
|
68
|
+
type D = NumberIntegerDivide<100, 3>; // [33, 1]
|
|
69
|
+
type T = Trunc<-234.601>; // -234
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## `@machine202502/types/math/internal`
|
|
73
|
+
|
|
74
|
+
Building blocks used by the public API. Prefer `@machine202502/types/math` in app code.
|
|
75
|
+
|
|
76
|
+
| Group | Types |
|
|
77
|
+
|-------|--------|
|
|
78
|
+
| Boolean | `ToBoolean`, `Not`, `And`, `Or`, `If` |
|
|
79
|
+
| Primitives | `NumericalDigit`, `NumericalDigitChar`, `NumericalSign`, `NumericalCompared`, `NumericalUintStringTuple` |
|
|
80
|
+
| String | `StringLength`, `StringToTuple` |
|
|
81
|
+
| Uint digit math | `NumberUintStringTupleAdd` / `Subtract` / `Multiply` / `Divide` / `Half` / `Power` / `Compare`, `NumberUintStringZeroLeftTrim`, `NumberUintStringZarr*`, conversion helpers |
|
|
82
|
+
|
|
83
|
+
## Examples
|
|
84
|
+
|
|
85
|
+
Runtime wrappers that *return* these types live in [`examples/`](./examples):
|
|
86
|
+
|
|
87
|
+
- `examples/example-module.ts` — functions whose return types are the package types
|
|
88
|
+
- `examples/example.ts` — end-to-end check (`npm run example`)
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import type { NumberIntegerMultiply } from "@machine202502/types/math";
|
|
92
|
+
|
|
93
|
+
function Multiply<L extends number, R extends number>(
|
|
94
|
+
l: L,
|
|
95
|
+
r: R,
|
|
96
|
+
): NumberIntegerMultiply<L, R> {
|
|
97
|
+
return (Math.trunc(l) * Math.trunc(r)) as NumberIntegerMultiply<L, R>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const n = Multiply(11, 11);
|
|
101
|
+
// ^? const n: 121
|
|
102
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type _AcceptableFrom = boolean | string | number | bigint | undefined | null | object;
|
|
2
|
+
type ToBoolean<B extends _AcceptableFrom> = B extends "" | 0 | 0n | false | undefined | null ? false : true;
|
|
3
|
+
type Not<B extends _AcceptableFrom> = ToBoolean<B> extends true ? false : true;
|
|
4
|
+
type And<L extends _AcceptableFrom, R extends _AcceptableFrom> = [
|
|
5
|
+
ToBoolean<L>,
|
|
6
|
+
ToBoolean<R>
|
|
7
|
+
] extends [true, true] ? true : false;
|
|
8
|
+
type Or<L extends _AcceptableFrom, R extends _AcceptableFrom> = [
|
|
9
|
+
ToBoolean<L>,
|
|
10
|
+
ToBoolean<R>
|
|
11
|
+
] extends [false, true] | [true, true] | [true, false] ? true : false;
|
|
12
|
+
type If<C extends _AcceptableFrom, TE, EE = void> = ToBoolean<C> extends true ? TE : EE;
|
|
13
|
+
export { ToBoolean, Not, And, Or, If };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type NumericalDigit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
2
|
+
type NumericalCompared = -1 | 0 | 1;
|
|
3
|
+
type NumericalSign = -1 | 0 | 1;
|
|
4
|
+
type NumericalDigitChar = `${NumericalDigit}`;
|
|
5
|
+
type NumericalUintStringTuple = NumericalDigitChar[];
|
|
6
|
+
export { NumericalDigit, NumericalCompared, NumericalSign };
|
|
7
|
+
export { NumericalDigitChar, NumericalUintStringTuple };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { IsFloat, IsInteger, IsOdd, IsEven, Abs, Sign, Negate, Signed, Trunc, NumberParts, } from "../number/number";
|
|
2
|
+
export type { NumberIntegerCompare, NumberIntegerGt, NumberIntegerGte, NumberIntegerLt, NumberIntegerLte, NumberIntegerMax, NumberIntegerMin, NumberIntegerEq, NumberIntegerNeq, NumberIntegerClamp, } from "../number-integer/number-integer-compare";
|
|
3
|
+
export type { NumberIntegerAdd, NumberIntegerSubtract, NumberIntegerMultiply, NumberIntegerDivide, NumberIntegerPower, } from "../number-integer/number-integer-arithmetic";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type { ToBoolean, Not, And, Or, If } from "../boolean/boolean";
|
|
2
|
+
export type { NumericalCompared, NumericalDigit, NumericalDigitChar, NumericalSign, NumericalUintStringTuple, } from "../common/types";
|
|
3
|
+
export type { StringLength, StringToTuple } from "../string/string";
|
|
4
|
+
export type { NumberUintStringTupleCompare } from "../number-uint-string/number-uint-string-compare";
|
|
5
|
+
export type { NumberUintStringTupleAdd } from "../number-uint-string/number-uint-string-arithmetic-add";
|
|
6
|
+
export type { NumberUintStringTupleSubtract } from "../number-uint-string/number-uint-string-arithmetic-subtract";
|
|
7
|
+
export type { NumberUintStringTupleDivide } from "../number-uint-string/number-uint-string-arithmetic-divide";
|
|
8
|
+
export type { NumberUintStringTupleMultiply, NumberUintStringTupleMultiplyOnDigit, NumberUintStringTupleMultiplyOnEachDigit, } from "../number-uint-string/number-uint-string-arithmetic-multiply";
|
|
9
|
+
export type { NumberUintStringTupleHalf } from "../number-uint-string/number-uint-string-arithmetic-half";
|
|
10
|
+
export type { NumberUintStringTuplePower } from "../number-uint-string/number-uint-string-arithmetic-power";
|
|
11
|
+
export type { NumberUintStringZeroLeftTrim } from "../number-uint-string/number-uint-string-trim";
|
|
12
|
+
export type { NumberUintStringZarr, NumberUintStringZarrFixedMethod, NumberUintStringZarrIterationMethod, } from "../number-uint-string/number-uint-string-zarr";
|
|
13
|
+
export type { NumberUintStringToTuple, NumberUintStringTupleToNumber, } from "../number-uint-string/number-uint-string-conversion";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NumericalSign } from "../common/types";
|
|
2
|
+
type IsInteger<N extends number> = `${N}` extends `${number}.${number}` ? false : true;
|
|
3
|
+
type IsFloat<N extends number> = `${N}` extends `${number}.${number}` ? true : false;
|
|
4
|
+
type Sign<N extends number> = N extends 0 ? 0 : `${N}` extends `-${number}` ? -1 : 1;
|
|
5
|
+
type _AbsInfer<N extends number> = `-${N}`;
|
|
6
|
+
type Abs<N extends number> = N extends 0 ? 0 : `${N}` extends _AbsInfer<infer X> ? X : N;
|
|
7
|
+
type _NegateInfer<N extends number> = `${N}`;
|
|
8
|
+
type Negate<N extends number> = N extends 0 ? 0 : `-${N}` extends _NegateInfer<infer A> ? A : `${N}` extends _AbsInfer<infer A> ? A : N;
|
|
9
|
+
type Signed<N extends number, S extends NumericalSign | [NumericalSign, NumericalSign]> = S extends 0 | [0, 0] | [0, 1] | [0, -1] | [1, 0] | [-1, 0] ? 0 : S extends 1 | [1, 1] | [-1, -1] ? Abs<N> : Negate<Abs<N>>;
|
|
10
|
+
type _NumberPartsSign<N extends number> = N extends 0 ? [sign: 0, number: 0] : `${N}` extends `-${infer AN extends number}` ? [sign: -1, number: AN] : [sign: 1, number: N];
|
|
11
|
+
type _NumberPartsSplit<N extends number> = `${N}` extends `${infer FixedString extends string}.${infer Float extends number}` ? FixedString extends `${infer Fixed extends number}` ? [fixed: Fixed, float: Float] : [fixed: 0, float: 0] : [fixed: N, float: 0];
|
|
12
|
+
type NumberParts<N extends number> = _NumberPartsSign<N> extends [
|
|
13
|
+
infer S extends NumericalSign,
|
|
14
|
+
infer AbsN extends number
|
|
15
|
+
] ? [sign: S, ..._NumberPartsSplit<AbsN>] : [sign: 0, fixed: 0, float: 0];
|
|
16
|
+
type Trunc<N extends number> = _NumberPartsSplit<N>[0];
|
|
17
|
+
type IsOdd<N extends number> = `${Trunc<N>}` extends `${string}${1 | 3 | 5 | 7 | 9}` ? true : false;
|
|
18
|
+
type IsEven<N extends number> = IsOdd<N> extends true ? false : true;
|
|
19
|
+
export { IsInteger, IsFloat, Sign, Abs, Negate, Signed, NumberParts, Trunc, IsOdd, IsEven, };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { NumericalSign, NumericalUintStringTuple } from "../common/types";
|
|
2
|
+
import { NumberUintStringToTuple, NumberUintStringTupleToNumber } from "../number-uint-string/number-uint-string-conversion";
|
|
3
|
+
import { NumberUintStringTupleAdd } from "../number-uint-string/number-uint-string-arithmetic-add";
|
|
4
|
+
import { NumberUintStringTupleSubtract } from "../number-uint-string/number-uint-string-arithmetic-subtract";
|
|
5
|
+
import { NumberUintStringTupleMultiply } from "../number-uint-string/number-uint-string-arithmetic-multiply";
|
|
6
|
+
import { NumberUintStringTupleDivide } from "../number-uint-string/number-uint-string-arithmetic-divide";
|
|
7
|
+
import { NumberUintStringTupleCompare } from "../number-uint-string/number-uint-string-compare";
|
|
8
|
+
import { NumberUintStringTuplePower } from "../number-uint-string/number-uint-string-arithmetic-power";
|
|
9
|
+
import { Negate, Trunc } from "../number/number";
|
|
10
|
+
import { IsEven } from "../number/number";
|
|
11
|
+
import { NumberUintStringZarr } from "../number-uint-string/number-uint-string-zarr";
|
|
12
|
+
type NumberIntegerAdd<L extends number, R extends number> = [
|
|
13
|
+
NumberUintStringToTuple<L>,
|
|
14
|
+
NumberUintStringToTuple<R>
|
|
15
|
+
] extends [
|
|
16
|
+
[
|
|
17
|
+
infer LSign extends NumericalSign,
|
|
18
|
+
infer LTuple extends NumericalUintStringTuple
|
|
19
|
+
],
|
|
20
|
+
[
|
|
21
|
+
infer RSign extends NumericalSign,
|
|
22
|
+
infer RTuple extends NumericalUintStringTuple
|
|
23
|
+
]
|
|
24
|
+
] ? [LSign, RSign] extends [0, 1 | -1] | [0, 0] ? Trunc<R> : [LSign, RSign] extends [1 | -1, 0] ? Trunc<L> : [LSign, RSign] extends [1, 1] | [-1, -1] ? NumberUintStringTupleToNumber<[
|
|
25
|
+
1,
|
|
26
|
+
NumberUintStringTupleAdd<LTuple, RTuple>
|
|
27
|
+
]> : NumberUintStringTupleCompare<LTuple, RTuple> extends 1 ? NumberUintStringTupleToNumber<[
|
|
28
|
+
LSign,
|
|
29
|
+
NumberUintStringTupleSubtract<LTuple, RTuple>
|
|
30
|
+
]> : NumberUintStringTupleToNumber<[
|
|
31
|
+
RSign,
|
|
32
|
+
NumberUintStringTupleSubtract<RTuple, LTuple>
|
|
33
|
+
]> : 0;
|
|
34
|
+
type NumberIntegerSubtract<L extends number, R extends number> = NumberIntegerAdd<L, Negate<R>>;
|
|
35
|
+
type NumberIntegerMultiply<L extends number, R extends number> = [
|
|
36
|
+
NumberUintStringToTuple<L>,
|
|
37
|
+
NumberUintStringToTuple<R>
|
|
38
|
+
] extends [
|
|
39
|
+
[
|
|
40
|
+
infer LSign extends NumericalSign,
|
|
41
|
+
infer LTuple extends NumericalUintStringTuple
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
infer RSign extends NumericalSign,
|
|
45
|
+
infer RTuple extends NumericalUintStringTuple
|
|
46
|
+
]
|
|
47
|
+
] ? [LSign, RSign] extends [0, 0] | [1 | -1, 0] | [0, 1 | -1] ? 0 : [LSign, RSign] extends [1, 1] | [-1, -1] ? NumberUintStringTupleToNumber<[
|
|
48
|
+
1,
|
|
49
|
+
NumberUintStringTupleMultiply<LTuple, RTuple>
|
|
50
|
+
]> : NumberUintStringTupleToNumber<[
|
|
51
|
+
-1,
|
|
52
|
+
NumberUintStringTupleMultiply<LTuple, RTuple>
|
|
53
|
+
]> : 0;
|
|
54
|
+
type NumberIntegerDivide<L extends number, R extends number> = [
|
|
55
|
+
NumberUintStringToTuple<L>,
|
|
56
|
+
NumberUintStringToTuple<R>
|
|
57
|
+
] extends [
|
|
58
|
+
[
|
|
59
|
+
infer LSign extends NumericalSign,
|
|
60
|
+
infer LTuple extends NumericalUintStringTuple
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
infer RSign extends NumericalSign,
|
|
64
|
+
infer RTuple extends NumericalUintStringTuple
|
|
65
|
+
]
|
|
66
|
+
] ? [LSign, RSign] extends [0, 0] | [1 | -1, 0] ? null : [LSign, RSign] extends [0, 1 | -1] ? [0, null] : NumberUintStringTupleDivide<LTuple, RTuple> extends [
|
|
67
|
+
infer QuotientNT extends NumericalUintStringTuple,
|
|
68
|
+
infer RemainderNT extends NumericalUintStringTuple
|
|
69
|
+
] ? [LSign, RSign] extends [1, 1] | [-1, -1] ? [
|
|
70
|
+
quotient: NumberUintStringTupleToNumber<[1, QuotientNT]>,
|
|
71
|
+
remainder: NumberUintStringTupleToNumber<[LSign, RemainderNT]>
|
|
72
|
+
] : [
|
|
73
|
+
quotient: NumberUintStringTupleToNumber<[-1, QuotientNT]>,
|
|
74
|
+
remainder: NumberUintStringTupleToNumber<[LSign, RemainderNT]>
|
|
75
|
+
] : never : never;
|
|
76
|
+
type NumberIntegerPower<N extends number, P extends number> = [
|
|
77
|
+
NumberUintStringToTuple<N>,
|
|
78
|
+
NumberUintStringToTuple<P>
|
|
79
|
+
] extends [
|
|
80
|
+
[
|
|
81
|
+
infer NSign extends NumericalSign,
|
|
82
|
+
infer NTuple extends NumericalUintStringTuple
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
infer PSign extends NumericalSign,
|
|
86
|
+
infer PTuple extends NumericalUintStringTuple
|
|
87
|
+
]
|
|
88
|
+
] ? PSign extends -1 ? null : PSign extends 0 ? 1 : IsEven<P> extends true ? NumberUintStringTupleToNumber<[
|
|
89
|
+
1,
|
|
90
|
+
NumberUintStringTuplePower<NTuple, NumberUintStringZarr<PTuple>>
|
|
91
|
+
]> : NumberUintStringTupleToNumber<[
|
|
92
|
+
NSign,
|
|
93
|
+
NumberUintStringTuplePower<NTuple, NumberUintStringZarr<PTuple>>
|
|
94
|
+
]> : 0;
|
|
95
|
+
export { NumberIntegerAdd, NumberIntegerSubtract, NumberIntegerMultiply, NumberIntegerDivide, NumberIntegerPower, };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NumericalSign, NumericalUintStringTuple } from "../common/types";
|
|
2
|
+
import { NumberUintStringToTuple } from "../number-uint-string/number-uint-string-conversion";
|
|
3
|
+
import { NumberUintStringTupleCompare } from "../number-uint-string/number-uint-string-compare";
|
|
4
|
+
import { Trunc } from "../number/number";
|
|
5
|
+
type NumberIntegerCompare<L extends number, R extends number> = [
|
|
6
|
+
NumberUintStringToTuple<L>,
|
|
7
|
+
NumberUintStringToTuple<R>
|
|
8
|
+
] extends [
|
|
9
|
+
[
|
|
10
|
+
infer LSign extends NumericalSign,
|
|
11
|
+
infer LTuple extends NumericalUintStringTuple
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
infer RSign extends NumericalSign,
|
|
15
|
+
infer RTuple extends NumericalUintStringTuple
|
|
16
|
+
]
|
|
17
|
+
] ? [LSign, RSign] extends [-1, 0] | [-1, 1] | [0, 1] ? -1 : [LSign, RSign] extends [1, -1] | [1, 0] | [0, -1] ? 1 : [LSign, RSign] extends [1, 1] ? NumberUintStringTupleCompare<LTuple, RTuple> : NumberUintStringTupleCompare<RTuple, LTuple> : 0;
|
|
18
|
+
type NumberIntegerGt<L extends number, R extends number> = NumberIntegerCompare<L, R> extends 1 ? true : false;
|
|
19
|
+
type NumberIntegerGte<L extends number, R extends number> = NumberIntegerCompare<L, R> extends 1 | 0 ? true : false;
|
|
20
|
+
type NumberIntegerLt<L extends number, R extends number> = NumberIntegerCompare<L, R> extends -1 ? true : false;
|
|
21
|
+
type NumberIntegerLte<L extends number, R extends number> = NumberIntegerCompare<L, R> extends -1 | 0 ? true : false;
|
|
22
|
+
type NumberIntegerEq<L extends number, R extends number> = NumberIntegerCompare<L, R> extends 0 ? true : false;
|
|
23
|
+
type NumberIntegerNeq<L extends number, R extends number> = NumberIntegerCompare<L, R> extends 1 | -1 ? true : false;
|
|
24
|
+
type NumberIntegerMin<L extends number, R extends number> = NumberIntegerLt<L, R> extends true ? Trunc<L> : Trunc<R>;
|
|
25
|
+
type NumberIntegerMax<L extends number, R extends number> = NumberIntegerGt<L, R> extends true ? Trunc<L> : Trunc<R>;
|
|
26
|
+
type NumberIntegerClamp<N extends number, Min extends number, Max extends number> = NumberIntegerMax<NumberIntegerMin<N, Max>, Min>;
|
|
27
|
+
export { NumberIntegerCompare, NumberIntegerGt, NumberIntegerGte, NumberIntegerLt, NumberIntegerLte, NumberIntegerEq, NumberIntegerNeq, NumberIntegerMin, NumberIntegerMax, NumberIntegerClamp, };
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { NumericalDigitChar, NumericalUintStringTuple } from "../common/types";
|
|
2
|
+
import { NumberUintCharge } from "./number-uint-string-common";
|
|
3
|
+
interface NumberUintAddMap {
|
|
4
|
+
"0,0,0": ["0", "0"];
|
|
5
|
+
"0,0,1": ["0", "1"];
|
|
6
|
+
"0,1,0": ["0", "1"];
|
|
7
|
+
"0,1,1": ["0", "2"];
|
|
8
|
+
"0,2,0": ["0", "2"];
|
|
9
|
+
"0,2,1": ["0", "3"];
|
|
10
|
+
"0,3,0": ["0", "3"];
|
|
11
|
+
"0,3,1": ["0", "4"];
|
|
12
|
+
"0,4,0": ["0", "4"];
|
|
13
|
+
"0,4,1": ["0", "5"];
|
|
14
|
+
"0,5,0": ["0", "5"];
|
|
15
|
+
"0,5,1": ["0", "6"];
|
|
16
|
+
"0,6,0": ["0", "6"];
|
|
17
|
+
"0,6,1": ["0", "7"];
|
|
18
|
+
"0,7,0": ["0", "7"];
|
|
19
|
+
"0,7,1": ["0", "8"];
|
|
20
|
+
"0,8,0": ["0", "8"];
|
|
21
|
+
"0,8,1": ["0", "9"];
|
|
22
|
+
"0,9,0": ["0", "9"];
|
|
23
|
+
"0,9,1": ["1", "0"];
|
|
24
|
+
"1,0,0": ["0", "1"];
|
|
25
|
+
"1,0,1": ["0", "2"];
|
|
26
|
+
"1,1,0": ["0", "2"];
|
|
27
|
+
"1,1,1": ["0", "3"];
|
|
28
|
+
"1,2,0": ["0", "3"];
|
|
29
|
+
"1,2,1": ["0", "4"];
|
|
30
|
+
"1,3,0": ["0", "4"];
|
|
31
|
+
"1,3,1": ["0", "5"];
|
|
32
|
+
"1,4,0": ["0", "5"];
|
|
33
|
+
"1,4,1": ["0", "6"];
|
|
34
|
+
"1,5,0": ["0", "6"];
|
|
35
|
+
"1,5,1": ["0", "7"];
|
|
36
|
+
"1,6,0": ["0", "7"];
|
|
37
|
+
"1,6,1": ["0", "8"];
|
|
38
|
+
"1,7,0": ["0", "8"];
|
|
39
|
+
"1,7,1": ["0", "9"];
|
|
40
|
+
"1,8,0": ["0", "9"];
|
|
41
|
+
"1,8,1": ["1", "0"];
|
|
42
|
+
"1,9,0": ["1", "0"];
|
|
43
|
+
"1,9,1": ["1", "1"];
|
|
44
|
+
"2,0,0": ["0", "2"];
|
|
45
|
+
"2,0,1": ["0", "3"];
|
|
46
|
+
"2,1,0": ["0", "3"];
|
|
47
|
+
"2,1,1": ["0", "4"];
|
|
48
|
+
"2,2,0": ["0", "4"];
|
|
49
|
+
"2,2,1": ["0", "5"];
|
|
50
|
+
"2,3,0": ["0", "5"];
|
|
51
|
+
"2,3,1": ["0", "6"];
|
|
52
|
+
"2,4,0": ["0", "6"];
|
|
53
|
+
"2,4,1": ["0", "7"];
|
|
54
|
+
"2,5,0": ["0", "7"];
|
|
55
|
+
"2,5,1": ["0", "8"];
|
|
56
|
+
"2,6,0": ["0", "8"];
|
|
57
|
+
"2,6,1": ["0", "9"];
|
|
58
|
+
"2,7,0": ["0", "9"];
|
|
59
|
+
"2,7,1": ["1", "0"];
|
|
60
|
+
"2,8,0": ["1", "0"];
|
|
61
|
+
"2,8,1": ["1", "1"];
|
|
62
|
+
"2,9,0": ["1", "1"];
|
|
63
|
+
"2,9,1": ["1", "2"];
|
|
64
|
+
"3,0,0": ["0", "3"];
|
|
65
|
+
"3,0,1": ["0", "4"];
|
|
66
|
+
"3,1,0": ["0", "4"];
|
|
67
|
+
"3,1,1": ["0", "5"];
|
|
68
|
+
"3,2,0": ["0", "5"];
|
|
69
|
+
"3,2,1": ["0", "6"];
|
|
70
|
+
"3,3,0": ["0", "6"];
|
|
71
|
+
"3,3,1": ["0", "7"];
|
|
72
|
+
"3,4,0": ["0", "7"];
|
|
73
|
+
"3,4,1": ["0", "8"];
|
|
74
|
+
"3,5,0": ["0", "8"];
|
|
75
|
+
"3,5,1": ["0", "9"];
|
|
76
|
+
"3,6,0": ["0", "9"];
|
|
77
|
+
"3,6,1": ["1", "0"];
|
|
78
|
+
"3,7,0": ["1", "0"];
|
|
79
|
+
"3,7,1": ["1", "1"];
|
|
80
|
+
"3,8,0": ["1", "1"];
|
|
81
|
+
"3,8,1": ["1", "2"];
|
|
82
|
+
"3,9,0": ["1", "2"];
|
|
83
|
+
"3,9,1": ["1", "3"];
|
|
84
|
+
"4,0,0": ["0", "4"];
|
|
85
|
+
"4,0,1": ["0", "5"];
|
|
86
|
+
"4,1,0": ["0", "5"];
|
|
87
|
+
"4,1,1": ["0", "6"];
|
|
88
|
+
"4,2,0": ["0", "6"];
|
|
89
|
+
"4,2,1": ["0", "7"];
|
|
90
|
+
"4,3,0": ["0", "7"];
|
|
91
|
+
"4,3,1": ["0", "8"];
|
|
92
|
+
"4,4,0": ["0", "8"];
|
|
93
|
+
"4,4,1": ["0", "9"];
|
|
94
|
+
"4,5,0": ["0", "9"];
|
|
95
|
+
"4,5,1": ["1", "0"];
|
|
96
|
+
"4,6,0": ["1", "0"];
|
|
97
|
+
"4,6,1": ["1", "1"];
|
|
98
|
+
"4,7,0": ["1", "1"];
|
|
99
|
+
"4,7,1": ["1", "2"];
|
|
100
|
+
"4,8,0": ["1", "2"];
|
|
101
|
+
"4,8,1": ["1", "3"];
|
|
102
|
+
"4,9,0": ["1", "3"];
|
|
103
|
+
"4,9,1": ["1", "4"];
|
|
104
|
+
"5,0,0": ["0", "5"];
|
|
105
|
+
"5,0,1": ["0", "6"];
|
|
106
|
+
"5,1,0": ["0", "6"];
|
|
107
|
+
"5,1,1": ["0", "7"];
|
|
108
|
+
"5,2,0": ["0", "7"];
|
|
109
|
+
"5,2,1": ["0", "8"];
|
|
110
|
+
"5,3,0": ["0", "8"];
|
|
111
|
+
"5,3,1": ["0", "9"];
|
|
112
|
+
"5,4,0": ["0", "9"];
|
|
113
|
+
"5,4,1": ["1", "0"];
|
|
114
|
+
"5,5,0": ["1", "0"];
|
|
115
|
+
"5,5,1": ["1", "1"];
|
|
116
|
+
"5,6,0": ["1", "1"];
|
|
117
|
+
"5,6,1": ["1", "2"];
|
|
118
|
+
"5,7,0": ["1", "2"];
|
|
119
|
+
"5,7,1": ["1", "3"];
|
|
120
|
+
"5,8,0": ["1", "3"];
|
|
121
|
+
"5,8,1": ["1", "4"];
|
|
122
|
+
"5,9,0": ["1", "4"];
|
|
123
|
+
"5,9,1": ["1", "5"];
|
|
124
|
+
"6,0,0": ["0", "6"];
|
|
125
|
+
"6,0,1": ["0", "7"];
|
|
126
|
+
"6,1,0": ["0", "7"];
|
|
127
|
+
"6,1,1": ["0", "8"];
|
|
128
|
+
"6,2,0": ["0", "8"];
|
|
129
|
+
"6,2,1": ["0", "9"];
|
|
130
|
+
"6,3,0": ["0", "9"];
|
|
131
|
+
"6,3,1": ["1", "0"];
|
|
132
|
+
"6,4,0": ["1", "0"];
|
|
133
|
+
"6,4,1": ["1", "1"];
|
|
134
|
+
"6,5,0": ["1", "1"];
|
|
135
|
+
"6,5,1": ["1", "2"];
|
|
136
|
+
"6,6,0": ["1", "2"];
|
|
137
|
+
"6,6,1": ["1", "3"];
|
|
138
|
+
"6,7,0": ["1", "3"];
|
|
139
|
+
"6,7,1": ["1", "4"];
|
|
140
|
+
"6,8,0": ["1", "4"];
|
|
141
|
+
"6,8,1": ["1", "5"];
|
|
142
|
+
"6,9,0": ["1", "5"];
|
|
143
|
+
"6,9,1": ["1", "6"];
|
|
144
|
+
"7,0,0": ["0", "7"];
|
|
145
|
+
"7,0,1": ["0", "8"];
|
|
146
|
+
"7,1,0": ["0", "8"];
|
|
147
|
+
"7,1,1": ["0", "9"];
|
|
148
|
+
"7,2,0": ["0", "9"];
|
|
149
|
+
"7,2,1": ["1", "0"];
|
|
150
|
+
"7,3,0": ["1", "0"];
|
|
151
|
+
"7,3,1": ["1", "1"];
|
|
152
|
+
"7,4,0": ["1", "1"];
|
|
153
|
+
"7,4,1": ["1", "2"];
|
|
154
|
+
"7,5,0": ["1", "2"];
|
|
155
|
+
"7,5,1": ["1", "3"];
|
|
156
|
+
"7,6,0": ["1", "3"];
|
|
157
|
+
"7,6,1": ["1", "4"];
|
|
158
|
+
"7,7,0": ["1", "4"];
|
|
159
|
+
"7,7,1": ["1", "5"];
|
|
160
|
+
"7,8,0": ["1", "5"];
|
|
161
|
+
"7,8,1": ["1", "6"];
|
|
162
|
+
"7,9,0": ["1", "6"];
|
|
163
|
+
"7,9,1": ["1", "7"];
|
|
164
|
+
"8,0,0": ["0", "8"];
|
|
165
|
+
"8,0,1": ["0", "9"];
|
|
166
|
+
"8,1,0": ["0", "9"];
|
|
167
|
+
"8,1,1": ["1", "0"];
|
|
168
|
+
"8,2,0": ["1", "0"];
|
|
169
|
+
"8,2,1": ["1", "1"];
|
|
170
|
+
"8,3,0": ["1", "1"];
|
|
171
|
+
"8,3,1": ["1", "2"];
|
|
172
|
+
"8,4,0": ["1", "2"];
|
|
173
|
+
"8,4,1": ["1", "3"];
|
|
174
|
+
"8,5,0": ["1", "3"];
|
|
175
|
+
"8,5,1": ["1", "4"];
|
|
176
|
+
"8,6,0": ["1", "4"];
|
|
177
|
+
"8,6,1": ["1", "5"];
|
|
178
|
+
"8,7,0": ["1", "5"];
|
|
179
|
+
"8,7,1": ["1", "6"];
|
|
180
|
+
"8,8,0": ["1", "6"];
|
|
181
|
+
"8,8,1": ["1", "7"];
|
|
182
|
+
"8,9,0": ["1", "7"];
|
|
183
|
+
"8,9,1": ["1", "8"];
|
|
184
|
+
"9,0,0": ["0", "9"];
|
|
185
|
+
"9,0,1": ["1", "0"];
|
|
186
|
+
"9,1,0": ["1", "0"];
|
|
187
|
+
"9,1,1": ["1", "1"];
|
|
188
|
+
"9,2,0": ["1", "1"];
|
|
189
|
+
"9,2,1": ["1", "2"];
|
|
190
|
+
"9,3,0": ["1", "2"];
|
|
191
|
+
"9,3,1": ["1", "3"];
|
|
192
|
+
"9,4,0": ["1", "3"];
|
|
193
|
+
"9,4,1": ["1", "4"];
|
|
194
|
+
"9,5,0": ["1", "4"];
|
|
195
|
+
"9,5,1": ["1", "5"];
|
|
196
|
+
"9,6,0": ["1", "5"];
|
|
197
|
+
"9,6,1": ["1", "6"];
|
|
198
|
+
"9,7,0": ["1", "6"];
|
|
199
|
+
"9,7,1": ["1", "7"];
|
|
200
|
+
"9,8,0": ["1", "7"];
|
|
201
|
+
"9,8,1": ["1", "8"];
|
|
202
|
+
"9,9,0": ["1", "8"];
|
|
203
|
+
"9,9,1": ["1", "9"];
|
|
204
|
+
}
|
|
205
|
+
type _NumberUintStringTupleAdd<LNT extends NumericalUintStringTuple, RNT extends NumericalUintStringTuple, ResultNT extends NumericalUintStringTuple, ResultCharge extends NumberUintCharge> = [LNT, RNT] extends [
|
|
206
|
+
[
|
|
207
|
+
...infer LNTRest extends NumericalUintStringTuple,
|
|
208
|
+
infer LNTDigit extends NumericalDigitChar
|
|
209
|
+
],
|
|
210
|
+
[
|
|
211
|
+
...infer RNTRest extends NumericalUintStringTuple,
|
|
212
|
+
infer RNTDigit extends NumericalDigitChar
|
|
213
|
+
]
|
|
214
|
+
] ? NumberUintAddMap[`${LNTDigit},${RNTDigit},${ResultCharge}`] extends [
|
|
215
|
+
infer AddCharge extends NumberUintCharge,
|
|
216
|
+
infer AddDigit extends NumericalDigitChar
|
|
217
|
+
] ? _NumberUintStringTupleAdd<LNTRest, RNTRest, [
|
|
218
|
+
AddDigit,
|
|
219
|
+
...ResultNT
|
|
220
|
+
], AddCharge> : [] : ResultCharge extends "0" ? [...LNT, ...RNT, ...ResultNT] : _NumberUintStringTupleAdd<[...LNT, ...RNT], ["1"], ResultNT, "0">;
|
|
221
|
+
type NumberUintStringTupleAdd<LNT extends NumericalUintStringTuple, RNT extends NumericalUintStringTuple> = _NumberUintStringTupleAdd<LNT, RNT, [], "0">;
|
|
222
|
+
export { NumberUintAddMap, NumberUintStringTupleAdd };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { NumericalUintStringTuple } from "../common/types";
|
|
2
|
+
import { NumberUintStringTupleCompare } from "./number-uint-string-compare";
|
|
3
|
+
import { NumberUintStringTupleAdd } from "./number-uint-string-arithmetic-add";
|
|
4
|
+
import { NumberUintStringTupleSubtract } from "./number-uint-string-arithmetic-subtract";
|
|
5
|
+
import { NumberUintStringTupleMultiply } from "./number-uint-string-arithmetic-multiply";
|
|
6
|
+
import { NumberUintStringTupleHalf } from "./number-uint-string-arithmetic-half";
|
|
7
|
+
import { NumberUintStringZeroLeftTrim } from "./number-uint-string-trim";
|
|
8
|
+
type _NumberUintStringTupleDivideBinary<LNT extends NumericalUintStringTuple, RNT extends NumericalUintStringTuple, LowNT extends NumericalUintStringTuple, HighNT extends NumericalUintStringTuple> = NumberUintStringTupleCompare<LowNT, HighNT> extends 0 | -1 ? NumberUintStringTupleHalf<NumberUintStringTupleAdd<LowNT, HighNT>> extends infer MidNT extends NumericalUintStringTuple ? NumberUintStringTupleMultiply<MidNT, RNT> extends infer MultipliedNT extends NumericalUintStringTuple ? NumberUintStringTupleCompare<MultipliedNT, LNT> extends 0 | -1 ? _NumberUintStringTupleDivideBinary<LNT, RNT, NumberUintStringTupleAdd<MidNT, ["1"]>, HighNT> : _NumberUintStringTupleDivideBinary<LNT, RNT, LowNT, NumberUintStringTupleSubtract<MidNT, ["1"]>> : never : never : [
|
|
9
|
+
quotient: HighNT,
|
|
10
|
+
remainder: NumberUintStringZeroLeftTrim<NumberUintStringTupleSubtract<LNT, NumberUintStringTupleMultiply<HighNT, RNT>>>
|
|
11
|
+
];
|
|
12
|
+
type NumberUintStringTupleDivide<LNT extends NumericalUintStringTuple, RNT extends NumericalUintStringTuple> = NumberUintStringTupleCompare<RNT, ["0"]> extends 0 ? null : _NumberUintStringTupleDivideBinary<LNT, RNT, ["0"], LNT>;
|
|
13
|
+
export { NumberUintStringTupleDivide };
|