ts-data-forge 11.0.0 → 12.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 +2 -2
- package/dist/number/branded-types/finite-number.d.mts +47 -61
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +37 -41
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +40 -46
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int.mjs +29 -31
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.d.mts +71 -59
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int16.mjs +56 -47
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.d.mts +71 -59
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/int32.mjs +56 -47
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts +76 -60
- package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/negative-finite-number.mjs +62 -49
- package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/negative-int.d.mts +66 -49
- package/dist/number/branded-types/negative-int.d.mts.map +1 -1
- package/dist/number/branded-types/negative-int.mjs +48 -39
- package/dist/number/branded-types/negative-int.mjs.map +1 -1
- package/dist/number/branded-types/negative-safe-int.d.mts +64 -57
- package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/negative-safe-int.mjs +49 -44
- package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +80 -65
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +65 -53
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +71 -58
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +55 -45
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +71 -59
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +55 -46
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts +70 -55
- package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.mjs +55 -43
- package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-int.d.mts +46 -146
- package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-int.mjs +33 -108
- package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.d.mts +62 -54
- package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.mjs +46 -41
- package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +62 -49
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +46 -37
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +51 -38
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +31 -27
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +59 -54
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +44 -41
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +59 -55
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +44 -42
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +60 -55
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +44 -42
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +59 -54
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +43 -41
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +59 -54
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +43 -41
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +82 -64
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +67 -52
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +53 -70
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +42 -52
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +68 -58
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +52 -45
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +68 -58
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +52 -45
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +72 -61
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +56 -48
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +68 -58
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +52 -45
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +68 -59
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +52 -46
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +52 -66
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +45 -47
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +68 -58
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +53 -46
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.d.mts +72 -55
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.mjs +52 -45
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +66 -59
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.mjs +51 -45
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +66 -57
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.mjs +50 -45
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/int8.d.mts +62 -66
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/int8.mjs +57 -51
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.d.mts +66 -59
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/enum/uint8.mjs +57 -51
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +9 -9
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +7 -7
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/package.json +2 -1
- package/src/number/branded-types/finite-number.mts +47 -61
- package/src/number/branded-types/int.mts +40 -46
- package/src/number/branded-types/int16.mts +72 -60
- package/src/number/branded-types/int32.mts +72 -60
- package/src/number/branded-types/negative-finite-number.mts +78 -71
- package/src/number/branded-types/negative-finite-number.test.mts +4 -4
- package/src/number/branded-types/negative-int.mts +68 -60
- package/src/number/branded-types/negative-int.test.mts +5 -5
- package/src/number/branded-types/negative-safe-int.mts +66 -68
- package/src/number/branded-types/negative-safe-int.test.mts +4 -4
- package/src/number/branded-types/non-negative-finite-number.mts +81 -66
- package/src/number/branded-types/non-negative-int16.mts +72 -59
- package/src/number/branded-types/non-negative-int32.mts +72 -60
- package/src/number/branded-types/non-positive-finite-number.mts +71 -56
- package/src/number/branded-types/non-positive-finite-number.test.mts +7 -7
- package/src/number/branded-types/non-positive-int.mts +47 -147
- package/src/number/branded-types/non-positive-int.test.mts +7 -7
- package/src/number/branded-types/non-positive-safe-int.mts +63 -55
- package/src/number/branded-types/non-positive-safe-int.test.mts +7 -7
- package/src/number/branded-types/non-zero-finite-number.mts +62 -51
- package/src/number/branded-types/non-zero-int.mts +51 -38
- package/src/number/branded-types/non-zero-int16.mts +60 -55
- package/src/number/branded-types/non-zero-int32.mts +60 -56
- package/src/number/branded-types/non-zero-safe-int.mts +61 -56
- package/src/number/branded-types/non-zero-uint16.mts +60 -55
- package/src/number/branded-types/non-zero-uint32.mts +60 -55
- package/src/number/branded-types/positive-finite-number.mts +83 -65
- package/src/number/branded-types/positive-int.mts +54 -71
- package/src/number/branded-types/positive-int16.mts +69 -59
- package/src/number/branded-types/positive-int32.mts +69 -59
- package/src/number/branded-types/positive-safe-int.mts +73 -62
- package/src/number/branded-types/positive-uint16.mts +69 -59
- package/src/number/branded-types/positive-uint32.mts +69 -60
- package/src/number/branded-types/safe-int.mts +53 -67
- package/src/number/branded-types/safe-uint.mts +69 -59
- package/src/number/branded-types/uint.mts +73 -56
- package/src/number/branded-types/uint16.mts +67 -60
- package/src/number/branded-types/uint32.mts +67 -58
- package/src/number/enum/int8.mts +70 -73
- package/src/number/enum/int8.test.mts +7 -4
- package/src/number/enum/uint8.mts +74 -66
- package/src/number/enum/uint8.test.mts +7 -4
- package/src/number/refined-number-utils.mts +22 -19
|
@@ -12,7 +12,7 @@ const {
|
|
|
12
12
|
MAX_VALUE,
|
|
13
13
|
add,
|
|
14
14
|
castType,
|
|
15
|
-
|
|
15
|
+
fromNumber,
|
|
16
16
|
is,
|
|
17
17
|
max: max_,
|
|
18
18
|
min: min_,
|
|
@@ -30,17 +30,8 @@ const {
|
|
|
30
30
|
typeNameInMessage,
|
|
31
31
|
} as const);
|
|
32
32
|
|
|
33
|
-
/**
|
|
34
|
-
* Returns the absolute value of a negative finite number.
|
|
35
|
-
*
|
|
36
|
-
* The absolute value of a negative finite number is always a positive finite
|
|
37
|
-
* number, so the result is typed as a {@link PositiveFiniteNumber}.
|
|
38
|
-
*
|
|
39
|
-
* @param x - The negative finite number.
|
|
40
|
-
* @returns `|x|` as a PositiveFiniteNumber.
|
|
41
|
-
*/
|
|
42
33
|
const abs = (x: ElementType): PositiveFiniteNumber =>
|
|
43
|
-
PositiveFiniteNumber.
|
|
34
|
+
PositiveFiniteNumber.fromNumber(Math.abs(x));
|
|
44
35
|
|
|
45
36
|
const floor = (
|
|
46
37
|
x: ElementType,
|
|
@@ -71,140 +62,156 @@ const round = (
|
|
|
71
62
|
>;
|
|
72
63
|
|
|
73
64
|
/**
|
|
74
|
-
*
|
|
65
|
+
* Type guard that checks if a value is a negative finite number.
|
|
66
|
+
*
|
|
67
|
+
* Returns `true` only for a finite value — never `NaN`, `Infinity`, or
|
|
68
|
+
* `-Infinity`.
|
|
75
69
|
*
|
|
76
|
-
* @param value The value to check
|
|
77
|
-
* @returns `true` if the value is a
|
|
70
|
+
* @param value - The value to check
|
|
71
|
+
* @returns `true` if the value is a negative finite number, `false` otherwise
|
|
78
72
|
*/
|
|
79
73
|
export const isNegativeFiniteNumber = is;
|
|
80
74
|
|
|
81
75
|
/**
|
|
82
|
-
* Casts a number to
|
|
76
|
+
* Casts a `number` to the `NegativeFiniteNumber` branded type.
|
|
77
|
+
*
|
|
78
|
+
* Validates that the value is a negative finite number and returns it with the
|
|
79
|
+
* `NegativeFiniteNumber` brand. Throws a `TypeError` otherwise.
|
|
83
80
|
*
|
|
84
|
-
* @param value The value to cast
|
|
85
|
-
* @returns The value as a NegativeFiniteNumber
|
|
86
|
-
* @throws {TypeError} If the value is not a negative finite number
|
|
81
|
+
* @param value - The value to cast
|
|
82
|
+
* @returns The value as a `NegativeFiniteNumber`
|
|
83
|
+
* @throws {TypeError} If the value is not a negative finite number
|
|
87
84
|
*/
|
|
88
85
|
export const asNegativeFiniteNumber = castType;
|
|
89
86
|
|
|
90
87
|
/**
|
|
91
|
-
* Namespace providing type-safe
|
|
92
|
-
*
|
|
88
|
+
* Namespace providing type-safe operations for the `NegativeFiniteNumber`
|
|
89
|
+
* branded type.
|
|
93
90
|
*
|
|
94
|
-
*
|
|
95
|
-
* that stay within the negative finite numbers clamp their results to the valid
|
|
96
|
-
* range, while operations whose result leaves the set (`mul`, `div`, `abs`) are
|
|
97
|
-
* typed to reflect the actual sign of the result.
|
|
91
|
+
* The `NegativeFiniteNumber` type represents a negative finite number.
|
|
98
92
|
*/
|
|
99
93
|
export const NegativeFiniteNumber = {
|
|
100
94
|
/**
|
|
101
|
-
* Type guard
|
|
95
|
+
* Type guard that checks if a value is a negative finite number.
|
|
102
96
|
*
|
|
103
|
-
* @param value The value to check
|
|
104
|
-
* @returns `true` if the value is a negative finite number, `false`
|
|
105
|
-
*
|
|
97
|
+
* @param value - The value to check
|
|
98
|
+
* @returns `true` if the value is a negative finite number, `false` otherwise
|
|
99
|
+
* @see {@link isNegativeFiniteNumber} for usage examples
|
|
106
100
|
*/
|
|
107
101
|
is,
|
|
108
102
|
|
|
109
103
|
/**
|
|
110
|
-
* The
|
|
111
|
-
*
|
|
112
|
-
*
|
|
104
|
+
* The largest value representable as `NegativeFiniteNumber` (the upper
|
|
105
|
+
* saturation target of `fromNumber`). The domain is open at `0` (excluded),
|
|
106
|
+
* so this is `-Number.MIN_VALUE` — the negative double closest to `0` —
|
|
107
|
+
* rather than `0`.
|
|
113
108
|
*/
|
|
114
109
|
MAX_VALUE,
|
|
115
110
|
|
|
116
111
|
/**
|
|
117
112
|
* Returns the absolute value of a negative finite number.
|
|
118
113
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
114
|
+
* The result is non-negative and keeps the `NegativeFiniteNumber` brand.
|
|
115
|
+
*
|
|
116
|
+
* @param a - The negative finite number value
|
|
117
|
+
* @returns The absolute value as a non-negative `NegativeFiniteNumber`
|
|
121
118
|
*/
|
|
122
119
|
abs,
|
|
123
120
|
|
|
124
121
|
/**
|
|
125
|
-
* Returns the
|
|
122
|
+
* Returns the smallest of the given negative finite numbers.
|
|
126
123
|
*
|
|
127
|
-
* @param
|
|
128
|
-
* @
|
|
129
|
-
* @returns The minimum value as a NegativeFiniteNumber.
|
|
124
|
+
* @param values - The negative finite numbers to compare (at least one required)
|
|
125
|
+
* @returns The smallest value as a `NegativeFiniteNumber`
|
|
130
126
|
*/
|
|
131
127
|
min: min_,
|
|
132
128
|
|
|
133
129
|
/**
|
|
134
|
-
* Returns the
|
|
130
|
+
* Returns the largest of the given negative finite numbers.
|
|
135
131
|
*
|
|
136
|
-
* @param
|
|
137
|
-
* @
|
|
138
|
-
* @returns The maximum value as a NegativeFiniteNumber.
|
|
132
|
+
* @param values - The negative finite numbers to compare (at least one required)
|
|
133
|
+
* @returns The largest value as a `NegativeFiniteNumber`
|
|
139
134
|
*/
|
|
140
135
|
max: max_,
|
|
141
136
|
|
|
142
137
|
/**
|
|
143
|
-
*
|
|
138
|
+
* Converts an arbitrary `number` into a `NegativeFiniteNumber`, saturating it
|
|
139
|
+
* into the range `[MIN_VALUE, MAX_VALUE]`.
|
|
140
|
+
*
|
|
141
|
+
* Unlike `asNegativeFiniteNumber`, this is total: out-of-range inputs are
|
|
142
|
+
* clamped to the nearest representable `NegativeFiniteNumber` instead of
|
|
143
|
+
* throwing.
|
|
144
144
|
*
|
|
145
|
-
* @param value The
|
|
146
|
-
* @returns The value
|
|
145
|
+
* @param value - The value to convert
|
|
146
|
+
* @returns The value as a `NegativeFiniteNumber`
|
|
147
147
|
*/
|
|
148
|
-
|
|
148
|
+
fromNumber,
|
|
149
149
|
|
|
150
150
|
/**
|
|
151
|
-
*
|
|
151
|
+
* Returns the greatest integer less than or equal to a negative finite
|
|
152
|
+
* number.
|
|
152
153
|
*
|
|
153
|
-
* @param
|
|
154
|
-
* @returns The
|
|
154
|
+
* @param a - The negative finite number value
|
|
155
|
+
* @returns The floored value as an integer
|
|
155
156
|
*/
|
|
156
157
|
floor,
|
|
157
158
|
|
|
158
159
|
/**
|
|
159
|
-
*
|
|
160
|
+
* Returns the smallest integer greater than or equal to a negative finite
|
|
161
|
+
* number.
|
|
160
162
|
*
|
|
161
|
-
* @param
|
|
162
|
-
* @returns The
|
|
163
|
+
* @param a - The negative finite number value
|
|
164
|
+
* @returns The ceiled value as an integer
|
|
163
165
|
*/
|
|
164
166
|
ceil,
|
|
165
167
|
|
|
166
168
|
/**
|
|
167
|
-
*
|
|
169
|
+
* Returns the value of a negative finite number rounded to the nearest
|
|
170
|
+
* integer.
|
|
168
171
|
*
|
|
169
|
-
* @param
|
|
170
|
-
* @returns The rounded value as
|
|
172
|
+
* @param a - The negative finite number value
|
|
173
|
+
* @returns The rounded value as an integer
|
|
171
174
|
*/
|
|
172
175
|
round,
|
|
173
176
|
|
|
174
177
|
/**
|
|
175
|
-
* Generates a random NegativeFiniteNumber
|
|
178
|
+
* Generates a random `NegativeFiniteNumber` within the given range.
|
|
176
179
|
*
|
|
177
|
-
*
|
|
180
|
+
* The range is inclusive on both ends.
|
|
181
|
+
*
|
|
182
|
+
* @param min - The minimum value (inclusive)
|
|
183
|
+
* @param max - The maximum value (inclusive)
|
|
184
|
+
* @returns A random `NegativeFiniteNumber` in `[min, max]`
|
|
178
185
|
*/
|
|
179
186
|
random,
|
|
180
187
|
|
|
181
188
|
/**
|
|
182
|
-
* Raises a
|
|
189
|
+
* Raises `a` to the power `b`, returning `a ** b` as a
|
|
190
|
+
* `NegativeFiniteNumber`.
|
|
183
191
|
*
|
|
184
|
-
* @param a The base
|
|
185
|
-
* @param b The exponent
|
|
186
|
-
* @returns `a ** b`
|
|
192
|
+
* @param a - The base negative finite number
|
|
193
|
+
* @param b - The exponent negative finite number
|
|
194
|
+
* @returns `a ** b` as a `NegativeFiniteNumber`
|
|
187
195
|
*/
|
|
188
196
|
pow,
|
|
189
197
|
|
|
190
198
|
/**
|
|
191
|
-
* Adds two
|
|
199
|
+
* Adds two negative finite numbers, returning `a + b` as a
|
|
200
|
+
* `NegativeFiniteNumber`.
|
|
192
201
|
*
|
|
193
|
-
* @param a The first
|
|
194
|
-
* @param b The second
|
|
195
|
-
* @returns `a
|
|
202
|
+
* @param a - The first negative finite number
|
|
203
|
+
* @param b - The second negative finite number
|
|
204
|
+
* @returns The sum of `a` and `b` as a `NegativeFiniteNumber`
|
|
196
205
|
*/
|
|
197
206
|
add,
|
|
198
207
|
|
|
199
208
|
/**
|
|
200
|
-
* Subtracts
|
|
201
|
-
*
|
|
202
|
-
* The mathematical result can be positive, so it is clamped to the negative
|
|
203
|
-
* finite range (maximum `-Number.MIN_VALUE`).
|
|
209
|
+
* Subtracts two negative finite numbers, returning `a - b` as a
|
|
210
|
+
* `NegativeFiniteNumber`.
|
|
204
211
|
*
|
|
205
|
-
* @param a The
|
|
206
|
-
* @param b The
|
|
207
|
-
* @returns
|
|
212
|
+
* @param a - The first negative finite number
|
|
213
|
+
* @param b - The second negative finite number
|
|
214
|
+
* @returns The difference of `a` and `b` as a `NegativeFiniteNumber`
|
|
208
215
|
*/
|
|
209
216
|
sub,
|
|
210
217
|
} as const;
|
|
@@ -93,13 +93,13 @@ describe('NegativeFiniteNumber test', () => {
|
|
|
93
93
|
});
|
|
94
94
|
});
|
|
95
95
|
|
|
96
|
-
describe('NegativeFiniteNumber.
|
|
96
|
+
describe('NegativeFiniteNumber.fromNumber', () => {
|
|
97
97
|
test('clamps non-negative values into range', () => {
|
|
98
|
-
expect(NegativeFiniteNumber.
|
|
98
|
+
expect(NegativeFiniteNumber.fromNumber(-5.5)).toBeCloseTo(-5.5, 5);
|
|
99
99
|
|
|
100
|
-
expect(NegativeFiniteNumber.
|
|
100
|
+
expect(NegativeFiniteNumber.fromNumber(0)).toBeLessThan(0);
|
|
101
101
|
|
|
102
|
-
expect(NegativeFiniteNumber.
|
|
102
|
+
expect(NegativeFiniteNumber.fromNumber(5)).toBeLessThan(0);
|
|
103
103
|
});
|
|
104
104
|
});
|
|
105
105
|
|
|
@@ -15,7 +15,7 @@ const {
|
|
|
15
15
|
MAX_VALUE,
|
|
16
16
|
add,
|
|
17
17
|
castType,
|
|
18
|
-
|
|
18
|
+
fromNumber,
|
|
19
19
|
is,
|
|
20
20
|
max: max_,
|
|
21
21
|
min: min_,
|
|
@@ -34,127 +34,135 @@ const {
|
|
|
34
34
|
typeNameInMessage,
|
|
35
35
|
} as const);
|
|
36
36
|
|
|
37
|
-
/**
|
|
38
|
-
* Returns the absolute value of a negative integer.
|
|
39
|
-
*
|
|
40
|
-
* The absolute value of a negative integer is always a positive integer
|
|
41
|
-
* (`>= 1`), so the result is typed as a {@link PositiveInt}.
|
|
42
|
-
*
|
|
43
|
-
* @param x - The negative integer.
|
|
44
|
-
* @returns `|x|` as a PositiveInt.
|
|
45
|
-
*/
|
|
46
37
|
const abs = (x: WithSmallInt<ElementType>): PositiveInt =>
|
|
47
|
-
PositiveInt.
|
|
38
|
+
PositiveInt.fromNumber(Math.abs(x));
|
|
48
39
|
|
|
49
40
|
/**
|
|
50
|
-
*
|
|
41
|
+
* Type guard that checks if a value is a negative integer.
|
|
42
|
+
*
|
|
43
|
+
* Returns `true` for a negative integer — a value with no fractional component,
|
|
44
|
+
* including values outside the safe integer range (unlike `SafeInt`).
|
|
51
45
|
*
|
|
52
|
-
* @param value The value to check
|
|
53
|
-
* @returns `true` if the value is a
|
|
46
|
+
* @param value - The value to check
|
|
47
|
+
* @returns `true` if the value is a negative integer, `false` otherwise
|
|
54
48
|
*/
|
|
55
49
|
export const isNegativeInt = is;
|
|
56
50
|
|
|
57
51
|
/**
|
|
58
|
-
* Casts a number to
|
|
52
|
+
* Casts a `number` to the `NegativeInt` branded type.
|
|
53
|
+
*
|
|
54
|
+
* Validates that the value is a negative integer and returns it with the
|
|
55
|
+
* `NegativeInt` brand. Throws a `TypeError` otherwise.
|
|
59
56
|
*
|
|
60
|
-
* @param value The value to cast
|
|
61
|
-
* @returns The value as a NegativeInt
|
|
62
|
-
* @throws {TypeError} If the value is not a negative integer
|
|
57
|
+
* @param value - The value to cast
|
|
58
|
+
* @returns The value as a `NegativeInt`
|
|
59
|
+
* @throws {TypeError} If the value is not a negative integer
|
|
63
60
|
*/
|
|
64
61
|
export const asNegativeInt = castType;
|
|
65
62
|
|
|
66
63
|
/**
|
|
67
|
-
* Namespace providing type-safe
|
|
64
|
+
* Namespace providing type-safe operations for the `NegativeInt` branded type.
|
|
68
65
|
*
|
|
69
|
-
* NegativeInt represents
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
66
|
+
* The `NegativeInt` type represents a negative integer. Division (`div`) uses
|
|
67
|
+
* floor division.
|
|
68
|
+
*
|
|
69
|
+
* Unlike `SafeInt`, `NegativeInt` allows values outside the safe integer range
|
|
70
|
+
* (±2^53 − 1), so very large magnitudes may lose precision in JavaScript's
|
|
71
|
+
* `number` type.
|
|
73
72
|
*/
|
|
74
73
|
export const NegativeInt = {
|
|
75
74
|
/**
|
|
76
|
-
* Type guard
|
|
75
|
+
* Type guard that checks if a value is a negative integer.
|
|
77
76
|
*
|
|
78
|
-
* @param value The value to check
|
|
79
|
-
* @returns `true` if the value is a negative integer, `false` otherwise
|
|
77
|
+
* @param value - The value to check
|
|
78
|
+
* @returns `true` if the value is a negative integer, `false` otherwise
|
|
79
|
+
* @see {@link isNegativeInt} for usage examples
|
|
80
80
|
*/
|
|
81
81
|
is,
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
|
-
* The
|
|
85
|
-
*
|
|
86
|
-
* @readonly
|
|
84
|
+
* The largest value representable as `NegativeInt` (the upper saturation
|
|
85
|
+
* target of `fromNumber`).
|
|
87
86
|
*/
|
|
88
87
|
MAX_VALUE,
|
|
89
88
|
|
|
90
89
|
/**
|
|
91
90
|
* Returns the absolute value of a negative integer.
|
|
92
91
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
92
|
+
* The result is non-negative and keeps the `NegativeInt` brand. Note that
|
|
93
|
+
* `Math.abs(Number.MIN_SAFE_INTEGER)` exceeds `Number.MAX_SAFE_INTEGER`, so
|
|
94
|
+
* use `SafeInt` for guaranteed precision.
|
|
95
|
+
*
|
|
96
|
+
* @param a - The negative integer value
|
|
97
|
+
* @returns The absolute value as a non-negative `NegativeInt`
|
|
95
98
|
*/
|
|
96
99
|
abs,
|
|
97
100
|
|
|
98
101
|
/**
|
|
99
|
-
* Returns the
|
|
102
|
+
* Returns the smallest of the given negative integers.
|
|
100
103
|
*
|
|
101
|
-
* @param
|
|
102
|
-
* @
|
|
103
|
-
* @returns The minimum value as a NegativeInt.
|
|
104
|
+
* @param values - The negative integers to compare (at least one required)
|
|
105
|
+
* @returns The smallest value as a `NegativeInt`
|
|
104
106
|
*/
|
|
105
107
|
min: min_,
|
|
106
108
|
|
|
107
109
|
/**
|
|
108
|
-
* Returns the
|
|
110
|
+
* Returns the largest of the given negative integers.
|
|
109
111
|
*
|
|
110
|
-
* @param
|
|
111
|
-
* @
|
|
112
|
-
* @returns The maximum value as a NegativeInt.
|
|
112
|
+
* @param values - The negative integers to compare (at least one required)
|
|
113
|
+
* @returns The largest value as a `NegativeInt`
|
|
113
114
|
*/
|
|
114
115
|
max: max_,
|
|
115
116
|
|
|
116
117
|
/**
|
|
117
|
-
*
|
|
118
|
+
* Converts an arbitrary `number` into a `NegativeInt`, rounding to the
|
|
119
|
+
* nearest integer and saturating the result into the range `[MIN_VALUE,
|
|
120
|
+
* MAX_VALUE]`.
|
|
118
121
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
122
|
+
* Unlike `asNegativeInt`, this is total: out-of-range inputs are clamped to
|
|
123
|
+
* the nearest representable `NegativeInt` instead of throwing.
|
|
124
|
+
*
|
|
125
|
+
* @param value - The value to convert
|
|
126
|
+
* @returns The value as a `NegativeInt`
|
|
121
127
|
*/
|
|
122
|
-
|
|
128
|
+
fromNumber,
|
|
123
129
|
|
|
124
130
|
/**
|
|
125
|
-
* Generates a random NegativeInt
|
|
131
|
+
* Generates a random `NegativeInt` within the given range.
|
|
132
|
+
*
|
|
133
|
+
* The range is inclusive on both ends.
|
|
126
134
|
*
|
|
127
|
-
* @
|
|
135
|
+
* @param min - The minimum value (inclusive)
|
|
136
|
+
* @param max - The maximum value (inclusive)
|
|
137
|
+
* @returns A random `NegativeInt` in `[min, max]`
|
|
128
138
|
*/
|
|
129
139
|
random,
|
|
130
140
|
|
|
131
141
|
/**
|
|
132
|
-
* Raises a
|
|
142
|
+
* Raises `a` to the power `b`, returning `a ** b` as a `NegativeInt` (floored
|
|
143
|
+
* to an integer).
|
|
133
144
|
*
|
|
134
|
-
* @param a The base negative integer
|
|
135
|
-
* @param b The exponent negative integer
|
|
136
|
-
* @returns `a ** b`
|
|
145
|
+
* @param a - The base negative integer
|
|
146
|
+
* @param b - The exponent negative integer
|
|
147
|
+
* @returns `a ** b` as a `NegativeInt`
|
|
137
148
|
*/
|
|
138
149
|
pow,
|
|
139
150
|
|
|
140
151
|
/**
|
|
141
|
-
* Adds two negative integers
|
|
152
|
+
* Adds two negative integers, returning `a + b` as a `NegativeInt`.
|
|
142
153
|
*
|
|
143
|
-
* @param a The first negative integer
|
|
144
|
-
* @param b The second negative integer
|
|
145
|
-
* @returns `a
|
|
154
|
+
* @param a - The first negative integer
|
|
155
|
+
* @param b - The second negative integer
|
|
156
|
+
* @returns The sum of `a` and `b` as a `NegativeInt`
|
|
146
157
|
*/
|
|
147
158
|
add,
|
|
148
159
|
|
|
149
160
|
/**
|
|
150
|
-
* Subtracts
|
|
151
|
-
*
|
|
152
|
-
* The mathematical result can be positive, so it is clamped to the negative
|
|
153
|
-
* integer range (maximum `-1`).
|
|
161
|
+
* Subtracts two negative integers, returning `a - b` as a `NegativeInt`.
|
|
154
162
|
*
|
|
155
|
-
* @param a The
|
|
156
|
-
* @param b The
|
|
157
|
-
* @returns `a
|
|
163
|
+
* @param a - The first negative integer
|
|
164
|
+
* @param b - The second negative integer
|
|
165
|
+
* @returns The difference of `a` and `b` as a `NegativeInt`
|
|
158
166
|
*/
|
|
159
167
|
sub,
|
|
160
168
|
} as const;
|
|
@@ -96,17 +96,17 @@ describe('NegativeInt test', () => {
|
|
|
96
96
|
});
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
describe('NegativeInt.
|
|
99
|
+
describe('NegativeInt.fromNumber', () => {
|
|
100
100
|
test('returns the same value if within range', () => {
|
|
101
|
-
expect(NegativeInt.
|
|
101
|
+
expect(NegativeInt.fromNumber(-5)).toBe(-5);
|
|
102
102
|
|
|
103
|
-
expect(NegativeInt.
|
|
103
|
+
expect(NegativeInt.fromNumber(-1000)).toBe(-1000);
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
test('clamps non-negative values to MAX_VALUE (-1)', () => {
|
|
107
|
-
expect(NegativeInt.
|
|
107
|
+
expect(NegativeInt.fromNumber(0)).toBe(-1);
|
|
108
108
|
|
|
109
|
-
expect(NegativeInt.
|
|
109
|
+
expect(NegativeInt.fromNumber(5)).toBe(-1);
|
|
110
110
|
});
|
|
111
111
|
});
|
|
112
112
|
|