ts-data-forge 1.0.0 → 1.0.1
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 +1 -1
- package/dist/array/array-utils.d.mts +2617 -0
- package/dist/array/array-utils.d.mts.map +1 -0
- package/dist/array/array-utils.mjs +2915 -0
- package/dist/array/array-utils.mjs.map +1 -0
- package/dist/array/index.d.mts +3 -0
- package/dist/array/index.d.mts.map +1 -0
- package/dist/array/index.mjs +3 -0
- package/dist/array/index.mjs.map +1 -0
- package/dist/array/tuple-utils.d.mts +421 -0
- package/dist/array/tuple-utils.d.mts.map +1 -0
- package/dist/array/tuple-utils.mjs +391 -0
- package/dist/array/tuple-utils.mjs.map +1 -0
- package/dist/collections/imap-mapped.d.mts +445 -0
- package/dist/collections/imap-mapped.d.mts.map +1 -0
- package/dist/collections/imap-mapped.mjs +424 -0
- package/dist/collections/imap-mapped.mjs.map +1 -0
- package/dist/collections/imap.d.mts +359 -0
- package/dist/collections/imap.d.mts.map +1 -0
- package/dist/collections/imap.mjs +338 -0
- package/dist/collections/imap.mjs.map +1 -0
- package/dist/collections/index.d.mts +7 -0
- package/dist/collections/index.d.mts.map +1 -0
- package/dist/collections/index.mjs +7 -0
- package/dist/collections/index.mjs.map +1 -0
- package/dist/collections/iset-mapped.d.mts +576 -0
- package/dist/collections/iset-mapped.d.mts.map +1 -0
- package/dist/collections/iset-mapped.mjs +522 -0
- package/dist/collections/iset-mapped.mjs.map +1 -0
- package/dist/collections/iset.d.mts +426 -0
- package/dist/collections/iset.d.mts.map +1 -0
- package/dist/collections/iset.mjs +437 -0
- package/dist/collections/iset.mjs.map +1 -0
- package/dist/collections/queue.d.mts +190 -0
- package/dist/collections/queue.d.mts.map +1 -0
- package/dist/collections/queue.mjs +317 -0
- package/dist/collections/queue.mjs.map +1 -0
- package/dist/collections/stack.d.mts +210 -0
- package/dist/collections/stack.d.mts.map +1 -0
- package/dist/collections/stack.mjs +353 -0
- package/dist/collections/stack.mjs.map +1 -0
- package/dist/expect-type.d.mts +199 -0
- package/dist/expect-type.d.mts.map +1 -0
- package/dist/expect-type.mjs +201 -0
- package/dist/expect-type.mjs.map +1 -0
- package/dist/functional/index.d.mts +5 -0
- package/dist/functional/index.d.mts.map +1 -0
- package/dist/functional/index.mjs +5 -0
- package/dist/functional/index.mjs.map +1 -0
- package/dist/functional/match.d.mts +215 -0
- package/dist/functional/match.d.mts.map +1 -0
- package/dist/functional/match.mjs +139 -0
- package/dist/functional/match.mjs.map +1 -0
- package/dist/functional/optional.d.mts +517 -0
- package/dist/functional/optional.d.mts.map +1 -0
- package/dist/functional/optional.mjs +532 -0
- package/dist/functional/optional.mjs.map +1 -0
- package/dist/functional/pipe.d.mts +185 -0
- package/dist/functional/pipe.d.mts.map +1 -0
- package/dist/functional/pipe.mjs +129 -0
- package/dist/functional/pipe.mjs.map +1 -0
- package/dist/functional/result.d.mts +796 -0
- package/dist/functional/result.d.mts.map +1 -0
- package/dist/functional/result.mjs +844 -0
- package/dist/functional/result.mjs.map +1 -0
- package/dist/globals.d.mts +38 -0
- package/dist/guard/has-key.d.mts +100 -0
- package/dist/guard/has-key.d.mts.map +1 -0
- package/dist/guard/has-key.mjs +94 -0
- package/dist/guard/has-key.mjs.map +1 -0
- package/dist/guard/index.d.mts +8 -0
- package/dist/guard/index.d.mts.map +1 -0
- package/dist/guard/index.mjs +8 -0
- package/dist/guard/index.mjs.map +1 -0
- package/dist/guard/is-non-empty-string.d.mts +106 -0
- package/dist/guard/is-non-empty-string.d.mts.map +1 -0
- package/dist/guard/is-non-empty-string.mjs +108 -0
- package/dist/guard/is-non-empty-string.mjs.map +1 -0
- package/dist/guard/is-non-null-object.d.mts +105 -0
- package/dist/guard/is-non-null-object.d.mts.map +1 -0
- package/dist/guard/is-non-null-object.mjs +108 -0
- package/dist/guard/is-non-null-object.mjs.map +1 -0
- package/dist/guard/is-primitive.d.mts +146 -0
- package/dist/guard/is-primitive.d.mts.map +1 -0
- package/dist/guard/is-primitive.mjs +161 -0
- package/dist/guard/is-primitive.mjs.map +1 -0
- package/dist/guard/is-record.d.mts +151 -0
- package/dist/guard/is-record.d.mts.map +1 -0
- package/dist/guard/is-record.mjs +155 -0
- package/dist/guard/is-record.mjs.map +1 -0
- package/dist/guard/is-type.d.mts +430 -0
- package/dist/guard/is-type.d.mts.map +1 -0
- package/dist/guard/is-type.mjs +432 -0
- package/dist/guard/is-type.mjs.map +1 -0
- package/dist/guard/key-is-in.d.mts +158 -0
- package/dist/guard/key-is-in.d.mts.map +1 -0
- package/dist/guard/key-is-in.mjs +160 -0
- package/dist/guard/key-is-in.mjs.map +1 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +61 -0
- package/dist/index.mjs.map +1 -0
- package/dist/iterator/index.d.mts +2 -0
- package/dist/iterator/index.d.mts.map +1 -0
- package/dist/iterator/index.mjs +2 -0
- package/dist/iterator/index.mjs.map +1 -0
- package/dist/iterator/range.d.mts +97 -0
- package/dist/iterator/range.d.mts.map +1 -0
- package/dist/iterator/range.mjs +130 -0
- package/dist/iterator/range.mjs.map +1 -0
- package/dist/json/index.d.mts +2 -0
- package/dist/json/index.d.mts.map +1 -0
- package/dist/json/index.mjs +2 -0
- package/dist/json/index.mjs.map +1 -0
- package/dist/json/json.d.mts +597 -0
- package/dist/json/json.d.mts.map +1 -0
- package/dist/json/json.mjs +687 -0
- package/dist/json/json.mjs.map +1 -0
- package/dist/number/branded-types/finite-number.d.mts +291 -0
- package/dist/number/branded-types/finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/finite-number.mjs +296 -0
- package/dist/number/branded-types/finite-number.mjs.map +1 -0
- package/dist/number/branded-types/index.d.mts +27 -0
- package/dist/number/branded-types/index.d.mts.map +1 -0
- package/dist/number/branded-types/index.mjs +27 -0
- package/dist/number/branded-types/index.mjs.map +1 -0
- package/dist/number/branded-types/int.d.mts +242 -0
- package/dist/number/branded-types/int.d.mts.map +1 -0
- package/dist/number/branded-types/int.mjs +239 -0
- package/dist/number/branded-types/int.mjs.map +1 -0
- package/dist/number/branded-types/int16.d.mts +162 -0
- package/dist/number/branded-types/int16.d.mts.map +1 -0
- package/dist/number/branded-types/int16.mjs +141 -0
- package/dist/number/branded-types/int16.mjs.map +1 -0
- package/dist/number/branded-types/int32.d.mts +155 -0
- package/dist/number/branded-types/int32.d.mts.map +1 -0
- package/dist/number/branded-types/int32.mjs +142 -0
- package/dist/number/branded-types/int32.mjs.map +1 -0
- package/dist/number/branded-types/non-negative-finite-number.d.mts +165 -0
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/non-negative-finite-number.mjs +160 -0
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/non-negative-int16.d.mts +160 -0
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -0
- package/dist/number/branded-types/non-negative-int16.mjs +138 -0
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -0
- package/dist/number/branded-types/non-negative-int32.d.mts +156 -0
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -0
- package/dist/number/branded-types/non-negative-int32.mjs +138 -0
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-finite-number.d.mts +154 -0
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-finite-number.mjs +160 -0
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-int.d.mts +131 -0
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-int.mjs +128 -0
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-int16.d.mts +166 -0
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-int16.mjs +145 -0
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-int32.d.mts +158 -0
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-int32.mjs +145 -0
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-safe-int.d.mts +148 -0
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-safe-int.mjs +145 -0
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-uint16.d.mts +160 -0
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-uint16.mjs +140 -0
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-uint32.d.mts +156 -0
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -0
- package/dist/number/branded-types/non-zero-uint32.mjs +140 -0
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -0
- package/dist/number/branded-types/positive-finite-number.d.mts +171 -0
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/positive-finite-number.mjs +165 -0
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/positive-int.d.mts +270 -0
- package/dist/number/branded-types/positive-int.d.mts.map +1 -0
- package/dist/number/branded-types/positive-int.mjs +257 -0
- package/dist/number/branded-types/positive-int.mjs.map +1 -0
- package/dist/number/branded-types/positive-int16.d.mts +162 -0
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -0
- package/dist/number/branded-types/positive-int16.mjs +139 -0
- package/dist/number/branded-types/positive-int16.mjs.map +1 -0
- package/dist/number/branded-types/positive-int32.d.mts +158 -0
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -0
- package/dist/number/branded-types/positive-int32.mjs +139 -0
- package/dist/number/branded-types/positive-int32.mjs.map +1 -0
- package/dist/number/branded-types/positive-safe-int.d.mts +152 -0
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/positive-safe-int.mjs +138 -0
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/positive-uint16.d.mts +160 -0
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -0
- package/dist/number/branded-types/positive-uint16.mjs +139 -0
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -0
- package/dist/number/branded-types/positive-uint32.d.mts +156 -0
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -0
- package/dist/number/branded-types/positive-uint32.mjs +139 -0
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -0
- package/dist/number/branded-types/safe-int.d.mts +243 -0
- package/dist/number/branded-types/safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/safe-int.mjs +240 -0
- package/dist/number/branded-types/safe-int.mjs.map +1 -0
- package/dist/number/branded-types/safe-uint.d.mts +151 -0
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -0
- package/dist/number/branded-types/safe-uint.mjs +138 -0
- package/dist/number/branded-types/safe-uint.mjs.map +1 -0
- package/dist/number/branded-types/uint.d.mts +144 -0
- package/dist/number/branded-types/uint.d.mts.map +1 -0
- package/dist/number/branded-types/uint.mjs +132 -0
- package/dist/number/branded-types/uint.mjs.map +1 -0
- package/dist/number/branded-types/uint16.d.mts +157 -0
- package/dist/number/branded-types/uint16.d.mts.map +1 -0
- package/dist/number/branded-types/uint16.mjs +137 -0
- package/dist/number/branded-types/uint16.mjs.map +1 -0
- package/dist/number/branded-types/uint32.d.mts +185 -0
- package/dist/number/branded-types/uint32.d.mts.map +1 -0
- package/dist/number/branded-types/uint32.mjs +169 -0
- package/dist/number/branded-types/uint32.mjs.map +1 -0
- package/dist/number/enum/index.d.mts +3 -0
- package/dist/number/enum/index.d.mts.map +1 -0
- package/dist/number/enum/index.mjs +3 -0
- package/dist/number/enum/index.mjs.map +1 -0
- package/dist/number/enum/int8.d.mts +202 -0
- package/dist/number/enum/int8.d.mts.map +1 -0
- package/dist/number/enum/int8.mjs +296 -0
- package/dist/number/enum/int8.mjs.map +1 -0
- package/dist/number/enum/uint8.d.mts +128 -0
- package/dist/number/enum/uint8.d.mts.map +1 -0
- package/dist/number/enum/uint8.mjs +251 -0
- package/dist/number/enum/uint8.mjs.map +1 -0
- package/dist/number/index.d.mts +5 -0
- package/dist/number/index.d.mts.map +1 -0
- package/dist/number/index.mjs +31 -0
- package/dist/number/index.mjs.map +1 -0
- package/dist/number/num.d.mts +515 -0
- package/dist/number/num.d.mts.map +1 -0
- package/dist/number/num.mjs +513 -0
- package/dist/number/num.mjs.map +1 -0
- package/dist/number/refined-number-utils.d.mts +191 -0
- package/dist/number/refined-number-utils.d.mts.map +1 -0
- package/dist/number/refined-number-utils.mjs +179 -0
- package/dist/number/refined-number-utils.mjs.map +1 -0
- package/dist/object/index.d.mts +2 -0
- package/dist/object/index.d.mts.map +1 -0
- package/dist/object/index.mjs +2 -0
- package/dist/object/index.mjs.map +1 -0
- package/dist/object/object.d.mts +296 -0
- package/dist/object/object.d.mts.map +1 -0
- package/dist/object/object.mjs +295 -0
- package/dist/object/object.mjs.map +1 -0
- package/dist/others/cast-mutable.d.mts +110 -0
- package/dist/others/cast-mutable.d.mts.map +1 -0
- package/dist/others/cast-mutable.mjs +114 -0
- package/dist/others/cast-mutable.mjs.map +1 -0
- package/dist/others/cast-readonly.d.mts +189 -0
- package/dist/others/cast-readonly.d.mts.map +1 -0
- package/dist/others/cast-readonly.mjs +193 -0
- package/dist/others/cast-readonly.mjs.map +1 -0
- package/dist/others/if-then.d.mts +98 -0
- package/dist/others/if-then.d.mts.map +1 -0
- package/dist/others/if-then.mjs +100 -0
- package/dist/others/if-then.mjs.map +1 -0
- package/dist/others/index.d.mts +8 -0
- package/dist/others/index.d.mts.map +1 -0
- package/dist/others/index.mjs +8 -0
- package/dist/others/index.mjs.map +1 -0
- package/dist/others/map-nullable.d.mts +151 -0
- package/dist/others/map-nullable.d.mts.map +1 -0
- package/dist/others/map-nullable.mjs +159 -0
- package/dist/others/map-nullable.mjs.map +1 -0
- package/dist/others/memoize-function.d.mts +173 -0
- package/dist/others/memoize-function.d.mts.map +1 -0
- package/dist/others/memoize-function.mjs +189 -0
- package/dist/others/memoize-function.mjs.map +1 -0
- package/dist/others/tuple.d.mts +159 -0
- package/dist/others/tuple.d.mts.map +1 -0
- package/dist/others/tuple.mjs +161 -0
- package/dist/others/tuple.mjs.map +1 -0
- package/dist/others/unknown-to-string.d.mts +180 -0
- package/dist/others/unknown-to-string.d.mts.map +1 -0
- package/dist/others/unknown-to-string.mjs +211 -0
- package/dist/others/unknown-to-string.mjs.map +1 -0
- package/dist/tsconfig.json +1 -0
- package/package.json +16 -14
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { TsVerifiedInternals } from '../refined-number-utils.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard that checks if a value is a safe integer.
|
|
4
|
+
*
|
|
5
|
+
* A safe integer is an integer that can be exactly represented in JavaScript
|
|
6
|
+
* without precision loss. The range is [±(2^53 - 1)].
|
|
7
|
+
*
|
|
8
|
+
* @param value - The value to check
|
|
9
|
+
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* isSafeInt(42); // true
|
|
14
|
+
* isSafeInt(Number.MAX_SAFE_INTEGER); // true
|
|
15
|
+
* isSafeInt(Number.MAX_SAFE_INTEGER + 1); // false
|
|
16
|
+
* isSafeInt(3.14); // false
|
|
17
|
+
* isSafeInt(NaN); // false
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const isSafeInt: (a: number) => a is SafeInt;
|
|
21
|
+
/**
|
|
22
|
+
* Casts a number to a SafeInt branded type.
|
|
23
|
+
*
|
|
24
|
+
* This function validates that the input is a safe integer (within ±(2^53 - 1))
|
|
25
|
+
* and returns it with the SafeInt brand. This ensures type safety for operations
|
|
26
|
+
* that require precise integer arithmetic.
|
|
27
|
+
*
|
|
28
|
+
* @param value - The value to cast
|
|
29
|
+
* @returns The value as a SafeInt branded type
|
|
30
|
+
* @throws {TypeError} If the value is not a safe integer
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const x = asSafeInt(5); // SafeInt
|
|
35
|
+
* const y = asSafeInt(-1000); // SafeInt
|
|
36
|
+
* const z = asSafeInt(2**50); // SafeInt (within range)
|
|
37
|
+
*
|
|
38
|
+
* // These throw TypeError:
|
|
39
|
+
* // asSafeInt(1.5); // Not an integer
|
|
40
|
+
* // asSafeInt(Number.MAX_SAFE_INTEGER + 1); // Exceeds safe range
|
|
41
|
+
* // asSafeInt(2**53); // Loss of precision
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const asSafeInt: <N extends number>(x: N) => number & {
|
|
45
|
+
readonly NaNValue: false;
|
|
46
|
+
readonly Finite: true;
|
|
47
|
+
readonly Int: true;
|
|
48
|
+
readonly SafeInt: true;
|
|
49
|
+
} & Readonly<{
|
|
50
|
+
'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3': unknown;
|
|
51
|
+
}> & N;
|
|
52
|
+
/**
|
|
53
|
+
* Namespace providing type-safe operations for SafeInt branded types.
|
|
54
|
+
*
|
|
55
|
+
* SafeInt represents integers that can be exactly represented in JavaScript's
|
|
56
|
+
* number type without precision loss. The range is [±(2^53 - 1)], which covers
|
|
57
|
+
* approximately ±9 quadrillion.
|
|
58
|
+
*
|
|
59
|
+
* All operations automatically clamp results to stay within the safe range,
|
|
60
|
+
* preventing precision loss that occurs with larger integers. This makes SafeInt
|
|
61
|
+
* ideal for:
|
|
62
|
+
* - Financial calculations requiring exact cents
|
|
63
|
+
* - Database IDs and counters
|
|
64
|
+
* - Array indices and sizes
|
|
65
|
+
* - Any integer arithmetic requiring precision guarantees
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Near the boundary
|
|
70
|
+
* const nearMax = asSafeInt(9007199254740990);
|
|
71
|
+
* const increment = asSafeInt(10);
|
|
72
|
+
*
|
|
73
|
+
* // Automatic clamping prevents precision loss
|
|
74
|
+
* const sum = SafeInt.add(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
75
|
+
* const product = SafeInt.mul(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
76
|
+
*
|
|
77
|
+
* // Safe operations
|
|
78
|
+
* const a = asSafeInt(1000000);
|
|
79
|
+
* const b = asSafeInt(500);
|
|
80
|
+
*
|
|
81
|
+
* const diff = SafeInt.sub(a, b); // SafeInt (999500)
|
|
82
|
+
* const quotient = SafeInt.div(a, b); // SafeInt (2000)
|
|
83
|
+
* const power = SafeInt.pow(b, asSafeInt(2)); // SafeInt (250000)
|
|
84
|
+
*
|
|
85
|
+
* // Utility operations
|
|
86
|
+
* const absolute = SafeInt.abs(asSafeInt(-42)); // SafeInt (42)
|
|
87
|
+
* const clamped = SafeInt.clamp(2**60); // SafeInt (MAX_SAFE_INTEGER)
|
|
88
|
+
*
|
|
89
|
+
* // Random generation
|
|
90
|
+
* const die = SafeInt.random(asSafeInt(1), asSafeInt(6)); // Random 1-6
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare const SafeInt: {
|
|
94
|
+
/**
|
|
95
|
+
* Type guard that checks if a value is a safe integer.
|
|
96
|
+
*
|
|
97
|
+
* @param value - The value to check
|
|
98
|
+
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
99
|
+
*
|
|
100
|
+
* @see {@link isSafeInt} for usage examples
|
|
101
|
+
*/
|
|
102
|
+
readonly is: (a: number) => a is SafeInt;
|
|
103
|
+
/**
|
|
104
|
+
* The minimum safe integer value (-(2^53 - 1)).
|
|
105
|
+
* @readonly
|
|
106
|
+
*/
|
|
107
|
+
readonly MIN_VALUE: SafeInt;
|
|
108
|
+
/**
|
|
109
|
+
* The maximum safe integer value (2^53 - 1).
|
|
110
|
+
* @readonly
|
|
111
|
+
*/
|
|
112
|
+
readonly MAX_VALUE: SafeUint;
|
|
113
|
+
/**
|
|
114
|
+
* Returns the absolute value of a safe integer.
|
|
115
|
+
*
|
|
116
|
+
* Note: `Math.abs(MIN_SAFE_INTEGER)` would exceed `MAX_SAFE_INTEGER`,
|
|
117
|
+
* so this function clamps the result to maintain the safe integer guarantee.
|
|
118
|
+
*
|
|
119
|
+
* @param a - The safe integer value
|
|
120
|
+
* @returns The absolute value as a SafeInt, clamped if necessary
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* SafeInt.abs(asSafeInt(-42)); // SafeInt (42)
|
|
125
|
+
* SafeInt.abs(asSafeInt(42)); // SafeInt (42)
|
|
126
|
+
* SafeInt.abs(SafeInt.MIN_VALUE); // SafeInt (MAX_SAFE_INTEGER)
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
readonly abs: (x: WithSmallInt<SafeInt, 40>) => TsVerifiedInternals.RefinedNumberUtils.ToNonNegative<SafeInt>;
|
|
130
|
+
/**
|
|
131
|
+
* Returns the minimum value from a list of safe integers.
|
|
132
|
+
*
|
|
133
|
+
* @param values - The safe integers to compare (at least one required)
|
|
134
|
+
* @returns The smallest value as a SafeInt
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* SafeInt.min(asSafeInt(5), asSafeInt(3)); // SafeInt (3)
|
|
139
|
+
* SafeInt.min(asSafeInt(-10), asSafeInt(0), asSafeInt(10)); // SafeInt (-10)
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
readonly min: (...values: readonly WithSmallInt<SafeInt, 40>[]) => SafeInt;
|
|
143
|
+
/**
|
|
144
|
+
* Returns the maximum value from a list of safe integers.
|
|
145
|
+
*
|
|
146
|
+
* @param values - The safe integers to compare (at least one required)
|
|
147
|
+
* @returns The largest value as a SafeInt
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* SafeInt.max(asSafeInt(5), asSafeInt(3)); // SafeInt (5)
|
|
152
|
+
* SafeInt.max(asSafeInt(-10), asSafeInt(0), asSafeInt(10)); // SafeInt (10)
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
readonly max: (...values: readonly WithSmallInt<SafeInt, 40>[]) => SafeInt;
|
|
156
|
+
/**
|
|
157
|
+
* Clamps a number to the safe integer range.
|
|
158
|
+
* @param value The number to clamp.
|
|
159
|
+
* @returns The value clamped to [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER] as a SafeInt.
|
|
160
|
+
*/
|
|
161
|
+
readonly clamp: (x: number) => SafeInt;
|
|
162
|
+
/**
|
|
163
|
+
* Generates a random safe integer within the specified range (inclusive).
|
|
164
|
+
*
|
|
165
|
+
* The range is inclusive on both ends. If min > max, they are automatically swapped.
|
|
166
|
+
*
|
|
167
|
+
* @param min - The minimum value (inclusive)
|
|
168
|
+
* @param max - The maximum value (inclusive)
|
|
169
|
+
* @returns A random SafeInt in the range [min, max]
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* // Dice roll
|
|
174
|
+
* const d20 = SafeInt.random(asSafeInt(1), asSafeInt(20));
|
|
175
|
+
*
|
|
176
|
+
* // Random index for large array
|
|
177
|
+
* const index = SafeInt.random(asSafeInt(0), asSafeInt(1000000));
|
|
178
|
+
*
|
|
179
|
+
* // Can use full safe range
|
|
180
|
+
* const any = SafeInt.random(SafeInt.MIN_VALUE, SafeInt.MAX_VALUE);
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
readonly random: (min: WithSmallInt<SafeInt, 40>, max: WithSmallInt<SafeInt, 40>) => SafeInt;
|
|
184
|
+
/**
|
|
185
|
+
* Raises a SafeInt to the power of another SafeInt.
|
|
186
|
+
* @param a The base SafeInt.
|
|
187
|
+
* @param b The exponent SafeInt.
|
|
188
|
+
* @returns `a ** b` clamped to safe integer range as a SafeInt.
|
|
189
|
+
*/
|
|
190
|
+
readonly pow: (x: WithSmallInt<SafeInt, 40>, y: WithSmallInt<SafeInt, 40>) => SafeInt;
|
|
191
|
+
/**
|
|
192
|
+
* Adds two SafeInt values.
|
|
193
|
+
* @param a The first SafeInt.
|
|
194
|
+
* @param b The second SafeInt.
|
|
195
|
+
* @returns `a + b` clamped to safe integer range as a SafeInt.
|
|
196
|
+
*/
|
|
197
|
+
readonly add: (x: WithSmallInt<SafeInt, 40>, y: WithSmallInt<SafeInt, 40>) => SafeInt;
|
|
198
|
+
/**
|
|
199
|
+
* Subtracts one SafeInt from another.
|
|
200
|
+
* @param a The minuend SafeInt.
|
|
201
|
+
* @param b The subtrahend SafeInt.
|
|
202
|
+
* @returns `a - b` clamped to safe integer range as a SafeInt.
|
|
203
|
+
*/
|
|
204
|
+
readonly sub: (x: WithSmallInt<SafeInt, 40>, y: WithSmallInt<SafeInt, 40>) => SafeInt;
|
|
205
|
+
/**
|
|
206
|
+
* Multiplies two SafeInt values.
|
|
207
|
+
* @param a The first SafeInt.
|
|
208
|
+
* @param b The second SafeInt.
|
|
209
|
+
* @returns `a * b` clamped to safe integer range as a SafeInt.
|
|
210
|
+
*/
|
|
211
|
+
readonly mul: (x: WithSmallInt<SafeInt, 40>, y: WithSmallInt<SafeInt, 40>) => SafeInt;
|
|
212
|
+
/**
|
|
213
|
+
* Divides one SafeInt by another using floor division.
|
|
214
|
+
*
|
|
215
|
+
* Performs mathematical floor division: `⌊a / b⌋`.
|
|
216
|
+
* The divisor must be non-zero (enforced by type constraints).
|
|
217
|
+
*
|
|
218
|
+
* @param a - The dividend
|
|
219
|
+
* @param b - The divisor (must be non-zero)
|
|
220
|
+
* @returns The integer quotient as a SafeInt
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* SafeInt.div(asSafeInt(10), asSafeInt(3)); // SafeInt (3)
|
|
225
|
+
* SafeInt.div(asSafeInt(-10), asSafeInt(3)); // SafeInt (-4)
|
|
226
|
+
*
|
|
227
|
+
* // Large number division
|
|
228
|
+
* const large = asSafeInt(1000000000000);
|
|
229
|
+
* const divisor = asSafeInt(1000000);
|
|
230
|
+
* SafeInt.div(large, divisor); // SafeInt (1000000)
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
readonly div: (x: WithSmallInt<SafeInt, 40>, y: 1 | 2 | 3 | 32 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 10 | 24 | 14 | 34 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 35 | 36 | 37 | 38 | 39 | -1 | -2 | -3 | -32 | -4 | -5 | -6 | -7 | -8 | -9 | -11 | -10 | -24 | -14 | -34 | -12 | -13 | -15 | -16 | -17 | -18 | -19 | -20 | -21 | -22 | -23 | -25 | -26 | -27 | -28 | -29 | -30 | -31 | -33 | -35 | -36 | -37 | -38 | -39 | -40 | NormalizeBrandUnion<number & {
|
|
234
|
+
readonly NaNValue: false;
|
|
235
|
+
readonly "!=0": true;
|
|
236
|
+
readonly Finite: true;
|
|
237
|
+
readonly Int: true;
|
|
238
|
+
readonly SafeInt: true;
|
|
239
|
+
} & Readonly<{
|
|
240
|
+
'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3': unknown;
|
|
241
|
+
}>>) => SafeInt;
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=safe-int.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-int.d.mts","sourceRoot":"","sources":["../../../src/number/branded-types/safe-int.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAkClE;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,6BAAK,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,SAAS;;;;;;;MAAW,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,OAAO;IAClB;;;;;;;OAOG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;;;;;;;;;;;;;OAeG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;OAIG;;IAGH;;;;;;;;;;;;;;;;;;;;OAoBG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;;;;;;;;;;;;;;;;OAoBG;;;;;;;;;;CAEK,CAAC"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { TsVerifiedInternals } from '../refined-number-utils.mjs';
|
|
2
|
+
|
|
3
|
+
const typeNameInMessage = 'a safe integer';
|
|
4
|
+
const { MIN_VALUE, MAX_VALUE, abs, min: min_, max: max_, pow, add, sub, mul, div, random, is, castType, clamp, } = TsVerifiedInternals.RefinedNumberUtils.operatorsForInteger({
|
|
5
|
+
integerOrSafeInteger: 'SafeInteger',
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
7
|
+
MIN_VALUE: Number.MIN_SAFE_INTEGER,
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
9
|
+
MAX_VALUE: Number.MAX_SAFE_INTEGER,
|
|
10
|
+
typeNameInMessage,
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Type guard that checks if a value is a safe integer.
|
|
14
|
+
*
|
|
15
|
+
* A safe integer is an integer that can be exactly represented in JavaScript
|
|
16
|
+
* without precision loss. The range is [±(2^53 - 1)].
|
|
17
|
+
*
|
|
18
|
+
* @param value - The value to check
|
|
19
|
+
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* isSafeInt(42); // true
|
|
24
|
+
* isSafeInt(Number.MAX_SAFE_INTEGER); // true
|
|
25
|
+
* isSafeInt(Number.MAX_SAFE_INTEGER + 1); // false
|
|
26
|
+
* isSafeInt(3.14); // false
|
|
27
|
+
* isSafeInt(NaN); // false
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
const isSafeInt = is;
|
|
31
|
+
/**
|
|
32
|
+
* Casts a number to a SafeInt branded type.
|
|
33
|
+
*
|
|
34
|
+
* This function validates that the input is a safe integer (within ±(2^53 - 1))
|
|
35
|
+
* and returns it with the SafeInt brand. This ensures type safety for operations
|
|
36
|
+
* that require precise integer arithmetic.
|
|
37
|
+
*
|
|
38
|
+
* @param value - The value to cast
|
|
39
|
+
* @returns The value as a SafeInt branded type
|
|
40
|
+
* @throws {TypeError} If the value is not a safe integer
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const x = asSafeInt(5); // SafeInt
|
|
45
|
+
* const y = asSafeInt(-1000); // SafeInt
|
|
46
|
+
* const z = asSafeInt(2**50); // SafeInt (within range)
|
|
47
|
+
*
|
|
48
|
+
* // These throw TypeError:
|
|
49
|
+
* // asSafeInt(1.5); // Not an integer
|
|
50
|
+
* // asSafeInt(Number.MAX_SAFE_INTEGER + 1); // Exceeds safe range
|
|
51
|
+
* // asSafeInt(2**53); // Loss of precision
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
const asSafeInt = castType;
|
|
55
|
+
/**
|
|
56
|
+
* Namespace providing type-safe operations for SafeInt branded types.
|
|
57
|
+
*
|
|
58
|
+
* SafeInt represents integers that can be exactly represented in JavaScript's
|
|
59
|
+
* number type without precision loss. The range is [±(2^53 - 1)], which covers
|
|
60
|
+
* approximately ±9 quadrillion.
|
|
61
|
+
*
|
|
62
|
+
* All operations automatically clamp results to stay within the safe range,
|
|
63
|
+
* preventing precision loss that occurs with larger integers. This makes SafeInt
|
|
64
|
+
* ideal for:
|
|
65
|
+
* - Financial calculations requiring exact cents
|
|
66
|
+
* - Database IDs and counters
|
|
67
|
+
* - Array indices and sizes
|
|
68
|
+
* - Any integer arithmetic requiring precision guarantees
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* // Near the boundary
|
|
73
|
+
* const nearMax = asSafeInt(9007199254740990);
|
|
74
|
+
* const increment = asSafeInt(10);
|
|
75
|
+
*
|
|
76
|
+
* // Automatic clamping prevents precision loss
|
|
77
|
+
* const sum = SafeInt.add(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
78
|
+
* const product = SafeInt.mul(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
79
|
+
*
|
|
80
|
+
* // Safe operations
|
|
81
|
+
* const a = asSafeInt(1000000);
|
|
82
|
+
* const b = asSafeInt(500);
|
|
83
|
+
*
|
|
84
|
+
* const diff = SafeInt.sub(a, b); // SafeInt (999500)
|
|
85
|
+
* const quotient = SafeInt.div(a, b); // SafeInt (2000)
|
|
86
|
+
* const power = SafeInt.pow(b, asSafeInt(2)); // SafeInt (250000)
|
|
87
|
+
*
|
|
88
|
+
* // Utility operations
|
|
89
|
+
* const absolute = SafeInt.abs(asSafeInt(-42)); // SafeInt (42)
|
|
90
|
+
* const clamped = SafeInt.clamp(2**60); // SafeInt (MAX_SAFE_INTEGER)
|
|
91
|
+
*
|
|
92
|
+
* // Random generation
|
|
93
|
+
* const die = SafeInt.random(asSafeInt(1), asSafeInt(6)); // Random 1-6
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
const SafeInt = {
|
|
97
|
+
/**
|
|
98
|
+
* Type guard that checks if a value is a safe integer.
|
|
99
|
+
*
|
|
100
|
+
* @param value - The value to check
|
|
101
|
+
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
102
|
+
*
|
|
103
|
+
* @see {@link isSafeInt} for usage examples
|
|
104
|
+
*/
|
|
105
|
+
is,
|
|
106
|
+
/**
|
|
107
|
+
* The minimum safe integer value (-(2^53 - 1)).
|
|
108
|
+
* @readonly
|
|
109
|
+
*/
|
|
110
|
+
MIN_VALUE,
|
|
111
|
+
/**
|
|
112
|
+
* The maximum safe integer value (2^53 - 1).
|
|
113
|
+
* @readonly
|
|
114
|
+
*/
|
|
115
|
+
MAX_VALUE,
|
|
116
|
+
/**
|
|
117
|
+
* Returns the absolute value of a safe integer.
|
|
118
|
+
*
|
|
119
|
+
* Note: `Math.abs(MIN_SAFE_INTEGER)` would exceed `MAX_SAFE_INTEGER`,
|
|
120
|
+
* so this function clamps the result to maintain the safe integer guarantee.
|
|
121
|
+
*
|
|
122
|
+
* @param a - The safe integer value
|
|
123
|
+
* @returns The absolute value as a SafeInt, clamped if necessary
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* SafeInt.abs(asSafeInt(-42)); // SafeInt (42)
|
|
128
|
+
* SafeInt.abs(asSafeInt(42)); // SafeInt (42)
|
|
129
|
+
* SafeInt.abs(SafeInt.MIN_VALUE); // SafeInt (MAX_SAFE_INTEGER)
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
abs,
|
|
133
|
+
/**
|
|
134
|
+
* Returns the minimum value from a list of safe integers.
|
|
135
|
+
*
|
|
136
|
+
* @param values - The safe integers to compare (at least one required)
|
|
137
|
+
* @returns The smallest value as a SafeInt
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* SafeInt.min(asSafeInt(5), asSafeInt(3)); // SafeInt (3)
|
|
142
|
+
* SafeInt.min(asSafeInt(-10), asSafeInt(0), asSafeInt(10)); // SafeInt (-10)
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
min: min_,
|
|
146
|
+
/**
|
|
147
|
+
* Returns the maximum value from a list of safe integers.
|
|
148
|
+
*
|
|
149
|
+
* @param values - The safe integers to compare (at least one required)
|
|
150
|
+
* @returns The largest value as a SafeInt
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* SafeInt.max(asSafeInt(5), asSafeInt(3)); // SafeInt (5)
|
|
155
|
+
* SafeInt.max(asSafeInt(-10), asSafeInt(0), asSafeInt(10)); // SafeInt (10)
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
max: max_,
|
|
159
|
+
/**
|
|
160
|
+
* Clamps a number to the safe integer range.
|
|
161
|
+
* @param value The number to clamp.
|
|
162
|
+
* @returns The value clamped to [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER] as a SafeInt.
|
|
163
|
+
*/
|
|
164
|
+
clamp,
|
|
165
|
+
/**
|
|
166
|
+
* Generates a random safe integer within the specified range (inclusive).
|
|
167
|
+
*
|
|
168
|
+
* The range is inclusive on both ends. If min > max, they are automatically swapped.
|
|
169
|
+
*
|
|
170
|
+
* @param min - The minimum value (inclusive)
|
|
171
|
+
* @param max - The maximum value (inclusive)
|
|
172
|
+
* @returns A random SafeInt in the range [min, max]
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* // Dice roll
|
|
177
|
+
* const d20 = SafeInt.random(asSafeInt(1), asSafeInt(20));
|
|
178
|
+
*
|
|
179
|
+
* // Random index for large array
|
|
180
|
+
* const index = SafeInt.random(asSafeInt(0), asSafeInt(1000000));
|
|
181
|
+
*
|
|
182
|
+
* // Can use full safe range
|
|
183
|
+
* const any = SafeInt.random(SafeInt.MIN_VALUE, SafeInt.MAX_VALUE);
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
random,
|
|
187
|
+
/**
|
|
188
|
+
* Raises a SafeInt to the power of another SafeInt.
|
|
189
|
+
* @param a The base SafeInt.
|
|
190
|
+
* @param b The exponent SafeInt.
|
|
191
|
+
* @returns `a ** b` clamped to safe integer range as a SafeInt.
|
|
192
|
+
*/
|
|
193
|
+
pow,
|
|
194
|
+
/**
|
|
195
|
+
* Adds two SafeInt values.
|
|
196
|
+
* @param a The first SafeInt.
|
|
197
|
+
* @param b The second SafeInt.
|
|
198
|
+
* @returns `a + b` clamped to safe integer range as a SafeInt.
|
|
199
|
+
*/
|
|
200
|
+
add,
|
|
201
|
+
/**
|
|
202
|
+
* Subtracts one SafeInt from another.
|
|
203
|
+
* @param a The minuend SafeInt.
|
|
204
|
+
* @param b The subtrahend SafeInt.
|
|
205
|
+
* @returns `a - b` clamped to safe integer range as a SafeInt.
|
|
206
|
+
*/
|
|
207
|
+
sub,
|
|
208
|
+
/**
|
|
209
|
+
* Multiplies two SafeInt values.
|
|
210
|
+
* @param a The first SafeInt.
|
|
211
|
+
* @param b The second SafeInt.
|
|
212
|
+
* @returns `a * b` clamped to safe integer range as a SafeInt.
|
|
213
|
+
*/
|
|
214
|
+
mul,
|
|
215
|
+
/**
|
|
216
|
+
* Divides one SafeInt by another using floor division.
|
|
217
|
+
*
|
|
218
|
+
* Performs mathematical floor division: `⌊a / b⌋`.
|
|
219
|
+
* The divisor must be non-zero (enforced by type constraints).
|
|
220
|
+
*
|
|
221
|
+
* @param a - The dividend
|
|
222
|
+
* @param b - The divisor (must be non-zero)
|
|
223
|
+
* @returns The integer quotient as a SafeInt
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```typescript
|
|
227
|
+
* SafeInt.div(asSafeInt(10), asSafeInt(3)); // SafeInt (3)
|
|
228
|
+
* SafeInt.div(asSafeInt(-10), asSafeInt(3)); // SafeInt (-4)
|
|
229
|
+
*
|
|
230
|
+
* // Large number division
|
|
231
|
+
* const large = asSafeInt(1000000000000);
|
|
232
|
+
* const divisor = asSafeInt(1000000);
|
|
233
|
+
* SafeInt.div(large, divisor); // SafeInt (1000000)
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
div,
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
export { SafeInt, asSafeInt, isSafeInt };
|
|
240
|
+
//# sourceMappingURL=safe-int.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-int.mjs","sources":["../../../src/number/branded-types/safe-int.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,MAAM,iBAAiB,GAAG,gBAAgB;AAE1C,MAAM,EACJ,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,IAAI,EACT,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,MAAM,EACN,EAAE,EACF,QAAQ,EACR,KAAK,GACN,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,mBAAmB,CAI5D;AACA,IAAA,oBAAoB,EAAE,aAAa;;IAEnC,SAAS,EAAE,MAAM,CAAC,gBAA2B;;IAE7C,SAAS,EAAE,MAAM,CAAC,gBAA4B;IAC9C,iBAAiB;AACT,CAAA,CAAC;AAEX;;;;;;;;;;;;;;;;;AAiBG;AACI,MAAM,SAAS,GAAG;AAEzB;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,MAAM,SAAS,GAAG;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;AACI,MAAM,OAAO,GAAG;AACrB;;;;;;;AAOG;IACH,EAAE;AAEF;;;AAGG;IACH,SAAS;AAET;;;AAGG;IACH,SAAS;AAET;;;;;;;;;;;;;;;AAeG;IACH,GAAG;AAEH;;;;;;;;;;;AAWG;AACH,IAAA,GAAG,EAAE,IAAI;AAET;;;;;;;;;;;AAWG;AACH,IAAA,GAAG,EAAE,IAAI;AAET;;;;AAIG;IACH,KAAK;AAEL;;;;;;;;;;;;;;;;;;;;AAoBG;IACH,MAAM;AAEN;;;;;AAKG;IACH,GAAG;AAEH;;;;;AAKG;IACH,GAAG;AAEH;;;;;AAKG;IACH,GAAG;AAEH;;;;;AAKG;IACH,GAAG;AAEH;;;;;;;;;;;;;;;;;;;;AAoBG;IACH,GAAG;;;;;"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a number is a SafeUint.
|
|
3
|
+
* @param value The value to check.
|
|
4
|
+
* @returns `true` if the value is a SafeUint, `false` otherwise.
|
|
5
|
+
*/
|
|
6
|
+
export declare const isSafeUint: (a: number) => a is SafeUint;
|
|
7
|
+
/**
|
|
8
|
+
* Casts a number to a SafeUint type.
|
|
9
|
+
* @param value The value to cast.
|
|
10
|
+
* @returns The value as a SafeUint type.
|
|
11
|
+
* @throws {TypeError} If the value is not a non-negative safe integer.
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const x = asSafeUint(5); // SafeUint
|
|
15
|
+
* const y = asSafeUint(0); // SafeUint
|
|
16
|
+
* // asSafeUint(-1); // throws TypeError
|
|
17
|
+
* // asSafeUint(1.5); // throws TypeError
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const asSafeUint: <N extends number>(x: N) => number & {
|
|
21
|
+
readonly NaNValue: false;
|
|
22
|
+
readonly "> -2^16": true;
|
|
23
|
+
readonly "> -2^32": true;
|
|
24
|
+
readonly ">= -2^15": true;
|
|
25
|
+
readonly ">= -2^31": true;
|
|
26
|
+
readonly ">=0": true;
|
|
27
|
+
readonly Finite: true;
|
|
28
|
+
readonly Int: true;
|
|
29
|
+
readonly SafeInt: true;
|
|
30
|
+
} & Readonly<{
|
|
31
|
+
'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3': unknown;
|
|
32
|
+
}> & N;
|
|
33
|
+
/**
|
|
34
|
+
* Namespace providing type-safe arithmetic operations for safe unsigned integers.
|
|
35
|
+
*
|
|
36
|
+
* All operations automatically clamp results to the safe unsigned integer range [0, MAX_SAFE_INTEGER].
|
|
37
|
+
* This ensures that all arithmetic maintains both the non-negative constraint and IEEE 754 precision guarantees,
|
|
38
|
+
* preventing precision loss while ensuring results are never negative.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const a = asSafeUint(9007199254740000); // Near MAX_SAFE_INTEGER
|
|
43
|
+
* const b = asSafeUint(1000);
|
|
44
|
+
*
|
|
45
|
+
* // Arithmetic operations with safe unsigned range clamping
|
|
46
|
+
* const sum = SafeUint.add(a, b); // SafeUint (clamped to MAX_SAFE_INTEGER)
|
|
47
|
+
* const diff = SafeUint.sub(b, a); // SafeUint (0 - clamped to MIN_VALUE)
|
|
48
|
+
* const product = SafeUint.mul(a, b); // SafeUint (clamped to MAX_SAFE_INTEGER)
|
|
49
|
+
*
|
|
50
|
+
* // Range operations
|
|
51
|
+
* const clamped = SafeUint.clamp(-100); // SafeUint (0)
|
|
52
|
+
* const minimum = SafeUint.min(a, b); // SafeUint (1000)
|
|
53
|
+
* const maximum = SafeUint.max(a, b); // SafeUint (a)
|
|
54
|
+
*
|
|
55
|
+
* // Utility operations
|
|
56
|
+
* const random = SafeUint.random(); // SafeUint (random safe unsigned integer)
|
|
57
|
+
* const power = SafeUint.pow(asSafeUint(2), asSafeUint(20)); // SafeUint (1048576)
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare const SafeUint: {
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if a value is a SafeUint.
|
|
63
|
+
* @param value The value to check.
|
|
64
|
+
* @returns `true` if the value is a non-negative safe integer, `false` otherwise.
|
|
65
|
+
*/
|
|
66
|
+
readonly is: (a: number) => a is SafeUint;
|
|
67
|
+
/**
|
|
68
|
+
* The minimum value for a safe unsigned integer.
|
|
69
|
+
* @readonly
|
|
70
|
+
*/
|
|
71
|
+
readonly MIN_VALUE: 0;
|
|
72
|
+
/**
|
|
73
|
+
* The maximum safe integer value (2^53 - 1).
|
|
74
|
+
* @readonly
|
|
75
|
+
*/
|
|
76
|
+
readonly MAX_VALUE: SafeUint;
|
|
77
|
+
/**
|
|
78
|
+
* Returns the smaller of two SafeUint values.
|
|
79
|
+
* @param a The first SafeUint.
|
|
80
|
+
* @param b The second SafeUint.
|
|
81
|
+
* @returns The minimum value as a SafeUint.
|
|
82
|
+
*/
|
|
83
|
+
readonly min: (...values: readonly WithSmallInt<SafeUint, 40>[]) => SafeUint;
|
|
84
|
+
/**
|
|
85
|
+
* Returns the larger of two SafeUint values.
|
|
86
|
+
* @param a The first SafeUint.
|
|
87
|
+
* @param b The second SafeUint.
|
|
88
|
+
* @returns The maximum value as a SafeUint.
|
|
89
|
+
*/
|
|
90
|
+
readonly max: (...values: readonly WithSmallInt<SafeUint, 40>[]) => SafeUint;
|
|
91
|
+
/**
|
|
92
|
+
* Clamps a number to the safe unsigned integer range.
|
|
93
|
+
* @param value The number to clamp.
|
|
94
|
+
* @returns The value clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
|
|
95
|
+
*/
|
|
96
|
+
readonly clamp: (x: number) => SafeUint;
|
|
97
|
+
/**
|
|
98
|
+
* Generates a random SafeUint value within the valid range.
|
|
99
|
+
* @returns A random SafeUint between 0 and MAX_SAFE_INTEGER.
|
|
100
|
+
*/
|
|
101
|
+
readonly random: (min: WithSmallInt<SafeUint, 40>, max: WithSmallInt<SafeUint, 40>) => SafeUint;
|
|
102
|
+
/**
|
|
103
|
+
* Raises a SafeUint to the power of another SafeUint.
|
|
104
|
+
* @param a The base SafeUint.
|
|
105
|
+
* @param b The exponent SafeUint.
|
|
106
|
+
* @returns `a ** b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
|
|
107
|
+
*/
|
|
108
|
+
readonly pow: (x: WithSmallInt<SafeUint, 40>, y: WithSmallInt<SafeUint, 40>) => SafeUint;
|
|
109
|
+
/**
|
|
110
|
+
* Adds two SafeUint values.
|
|
111
|
+
* @param a The first SafeUint.
|
|
112
|
+
* @param b The second SafeUint.
|
|
113
|
+
* @returns `a + b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
|
|
114
|
+
*/
|
|
115
|
+
readonly add: (x: WithSmallInt<SafeUint, 40>, y: WithSmallInt<SafeUint, 40>) => SafeUint;
|
|
116
|
+
/**
|
|
117
|
+
* Subtracts one SafeUint from another.
|
|
118
|
+
* @param a The minuend SafeUint.
|
|
119
|
+
* @param b The subtrahend SafeUint.
|
|
120
|
+
* @returns `a - b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint (minimum 0).
|
|
121
|
+
*/
|
|
122
|
+
readonly sub: (x: WithSmallInt<SafeUint, 40>, y: WithSmallInt<SafeUint, 40>) => SafeUint;
|
|
123
|
+
/**
|
|
124
|
+
* Multiplies two SafeUint values.
|
|
125
|
+
* @param a The first SafeUint.
|
|
126
|
+
* @param b The second SafeUint.
|
|
127
|
+
* @returns `a * b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
|
|
128
|
+
*/
|
|
129
|
+
readonly mul: (x: WithSmallInt<SafeUint, 40>, y: WithSmallInt<SafeUint, 40>) => SafeUint;
|
|
130
|
+
/**
|
|
131
|
+
* Divides one SafeUint by another using floor division.
|
|
132
|
+
* @param a The dividend SafeUint.
|
|
133
|
+
* @param b The divisor SafeUint.
|
|
134
|
+
* @returns `⌊a / b⌋` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
|
|
135
|
+
*/
|
|
136
|
+
readonly div: (x: WithSmallInt<SafeUint, 40>, y: 1 | 2 | 3 | 32 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 10 | 24 | 14 | 34 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 35 | 36 | 37 | 38 | 39 | NormalizeBrandUnion<number & {
|
|
137
|
+
readonly NaNValue: false;
|
|
138
|
+
readonly "!=0": true;
|
|
139
|
+
readonly "> -2^16": true;
|
|
140
|
+
readonly "> -2^32": true;
|
|
141
|
+
readonly ">= -2^15": true;
|
|
142
|
+
readonly ">= -2^31": true;
|
|
143
|
+
readonly ">=0": true;
|
|
144
|
+
readonly Finite: true;
|
|
145
|
+
readonly Int: true;
|
|
146
|
+
readonly SafeInt: true;
|
|
147
|
+
} & Readonly<{
|
|
148
|
+
'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3': unknown;
|
|
149
|
+
}>>) => SafeUint;
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=safe-uint.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-uint.d.mts","sourceRoot":"","sources":["../../../src/number/branded-types/safe-uint.mts"],"names":[],"mappings":"AAiCA;;;;GAIG;AACH,eAAO,MAAM,UAAU,8BAAK,CAAC;AAE7B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;MAAW,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,QAAQ;IACnB;;;;OAIG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;OAIG;;IAGH;;;OAGG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;IAGH;;;;;OAKG;;;;;;;;;;;;;;;CAEK,CAAC"}
|