ts-data-forge 3.3.0 → 3.3.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 +37 -13
- package/dist/array/impl/array-utils-creation.d.mts +116 -0
- package/dist/array/impl/array-utils-creation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-creation.mjs +110 -0
- package/dist/array/impl/array-utils-creation.mjs.map +1 -0
- package/dist/array/impl/array-utils-element-access.d.mts +61 -0
- package/dist/array/impl/array-utils-element-access.d.mts.map +1 -0
- package/dist/array/impl/array-utils-element-access.mjs +66 -0
- package/dist/array/impl/array-utils-element-access.mjs.map +1 -0
- package/dist/array/impl/array-utils-iterators.d.mts +59 -0
- package/dist/array/impl/array-utils-iterators.d.mts.map +1 -0
- package/dist/array/impl/array-utils-iterators.mjs +104 -0
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -0
- package/dist/array/impl/array-utils-modification.d.mts +154 -0
- package/dist/array/impl/array-utils-modification.d.mts.map +1 -0
- package/dist/array/impl/array-utils-modification.mjs +139 -0
- package/dist/array/impl/array-utils-modification.mjs.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts +214 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.mjs +160 -0
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -0
- package/dist/array/impl/array-utils-search.d.mts +179 -0
- package/dist/array/impl/array-utils-search.d.mts.map +1 -0
- package/dist/array/impl/array-utils-search.mjs +153 -0
- package/dist/array/impl/array-utils-search.mjs.map +1 -0
- package/dist/array/impl/array-utils-set-op.d.mts +100 -0
- package/dist/array/impl/array-utils-set-op.d.mts.map +1 -0
- package/dist/array/impl/array-utils-set-op.mjs +137 -0
- package/dist/array/impl/array-utils-set-op.mjs.map +1 -0
- package/dist/array/impl/array-utils-size.d.mts +24 -0
- package/dist/array/impl/array-utils-size.d.mts.map +1 -0
- package/dist/array/impl/array-utils-size.mjs +28 -0
- package/dist/array/impl/array-utils-size.mjs.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts +18 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs +49 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -0
- package/dist/array/impl/array-utils-slicing.d.mts +120 -0
- package/dist/array/impl/array-utils-slicing.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slicing.mjs +140 -0
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -0
- package/dist/array/impl/array-utils-transformation.d.mts +348 -0
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-transformation.mjs +331 -0
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -0
- package/dist/array/impl/array-utils-validation.d.mts +149 -0
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-validation.mjs +166 -0
- package/dist/array/impl/array-utils-validation.mjs.map +1 -0
- package/dist/array/impl/index.d.mts +13 -0
- package/dist/array/impl/index.d.mts.map +1 -0
- package/dist/array/impl/index.mjs +13 -0
- package/dist/array/impl/index.mjs.map +1 -0
- package/dist/array/index.d.mts +1 -1
- package/dist/array/index.d.mts.map +1 -1
- package/dist/array/index.mjs +2 -1
- package/dist/array/index.mjs.map +1 -1
- package/dist/collections/imap-mapped.d.mts +83 -253
- package/dist/collections/imap-mapped.d.mts.map +1 -1
- package/dist/collections/imap-mapped.mjs +33 -164
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.d.mts +436 -163
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +74 -94
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +828 -345
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +200 -242
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +397 -205
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs +102 -184
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.d.mts +155 -135
- package/dist/collections/queue.d.mts.map +1 -1
- package/dist/collections/queue.mjs +55 -156
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.d.mts +154 -154
- package/dist/collections/stack.d.mts.map +1 -1
- package/dist/collections/stack.mjs +54 -203
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.d.mts +1 -0
- package/dist/entry-point.d.mts.map +1 -1
- package/dist/entry-point.mjs +2 -1
- package/dist/entry-point.mjs.map +1 -1
- package/dist/expect-type.d.mts +43 -172
- package/dist/expect-type.d.mts.map +1 -1
- package/dist/expect-type.mjs +43 -172
- package/dist/expect-type.mjs.map +1 -1
- package/dist/functional/match.d.mts +35 -140
- package/dist/functional/match.d.mts.map +1 -1
- package/dist/functional/match.mjs.map +1 -1
- package/dist/functional/optional.d.mts +282 -160
- package/dist/functional/optional.d.mts.map +1 -1
- package/dist/functional/optional.mjs +131 -71
- package/dist/functional/optional.mjs.map +1 -1
- package/dist/functional/pipe.d.mts +59 -113
- package/dist/functional/pipe.d.mts.map +1 -1
- package/dist/functional/pipe.mjs.map +1 -1
- package/dist/functional/result.d.mts +433 -332
- package/dist/functional/result.d.mts.map +1 -1
- package/dist/functional/result.mjs +233 -239
- package/dist/functional/result.mjs.map +1 -1
- package/dist/globals.d.mts +12 -5
- package/dist/guard/has-key.d.mts +23 -74
- package/dist/guard/has-key.d.mts.map +1 -1
- package/dist/guard/has-key.mjs +23 -74
- package/dist/guard/has-key.mjs.map +1 -1
- package/dist/guard/is-non-empty-string.d.mts +20 -87
- package/dist/guard/is-non-empty-string.d.mts.map +1 -1
- package/dist/guard/is-non-empty-string.mjs +20 -87
- package/dist/guard/is-non-empty-string.mjs.map +1 -1
- package/dist/guard/is-non-null-object.d.mts +14 -84
- package/dist/guard/is-non-null-object.d.mts.map +1 -1
- package/dist/guard/is-non-null-object.mjs +14 -84
- package/dist/guard/is-non-null-object.mjs.map +1 -1
- package/dist/guard/is-primitive.d.mts +13 -126
- package/dist/guard/is-primitive.d.mts.map +1 -1
- package/dist/guard/is-primitive.mjs +13 -126
- package/dist/guard/is-primitive.mjs.map +1 -1
- package/dist/guard/is-record.d.mts +21 -132
- package/dist/guard/is-record.d.mts.map +1 -1
- package/dist/guard/is-record.mjs +21 -132
- package/dist/guard/is-record.mjs.map +1 -1
- package/dist/guard/is-type.d.mts +201 -238
- package/dist/guard/is-type.d.mts.map +1 -1
- package/dist/guard/is-type.mjs +201 -238
- package/dist/guard/is-type.mjs.map +1 -1
- package/dist/guard/key-is-in.d.mts +22 -139
- package/dist/guard/key-is-in.d.mts.map +1 -1
- package/dist/guard/key-is-in.mjs +22 -139
- package/dist/guard/key-is-in.mjs.map +1 -1
- package/dist/index.d.mts +0 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/range.d.mts +29 -62
- package/dist/iterator/range.d.mts.map +1 -1
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.d.mts +191 -121
- package/dist/json/json.d.mts.map +1 -1
- package/dist/json/json.mjs +238 -136
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +24 -156
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +27 -159
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +122 -120
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int.mjs +122 -120
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.d.mts +22 -30
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int16.mjs +22 -30
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.d.mts +22 -31
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/int32.mjs +22 -31
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +28 -36
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +31 -39
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +24 -34
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +24 -34
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +26 -35
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +26 -35
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +22 -37
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +25 -40
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +15 -30
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +15 -30
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +27 -35
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +27 -35
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +29 -36
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +29 -36
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +37 -38
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +39 -40
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +24 -35
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +24 -35
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +26 -40
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +29 -43
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +133 -123
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +133 -123
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +24 -35
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +24 -35
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +24 -35
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +24 -35
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +159 -33
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +160 -34
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +24 -35
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +24 -35
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +26 -36
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +26 -36
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +140 -99
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +142 -101
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +24 -33
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +25 -34
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.d.mts +121 -30
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.mjs +121 -30
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +26 -34
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.mjs +26 -34
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +26 -68
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.mjs +26 -68
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/int8.d.mts +37 -101
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/int8.mjs +39 -170
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.d.mts +45 -55
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/enum/uint8.mjs +46 -155
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/num.d.mts +145 -206
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/num.mjs +143 -199
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +97 -21
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +91 -20
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.d.mts +126 -208
- package/dist/object/object.d.mts.map +1 -1
- package/dist/object/object.mjs +68 -102
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/cast-mutable.d.mts +12 -88
- package/dist/others/cast-mutable.d.mts.map +1 -1
- package/dist/others/cast-mutable.mjs +13 -89
- package/dist/others/cast-mutable.mjs.map +1 -1
- package/dist/others/cast-readonly.d.mts +12 -168
- package/dist/others/cast-readonly.d.mts.map +1 -1
- package/dist/others/cast-readonly.mjs +13 -169
- package/dist/others/cast-readonly.mjs.map +1 -1
- package/dist/others/if-then.d.mts +6 -83
- package/dist/others/if-then.d.mts.map +1 -1
- package/dist/others/if-then.mjs +6 -83
- package/dist/others/if-then.mjs.map +1 -1
- package/dist/others/map-nullable.d.mts +12 -136
- package/dist/others/map-nullable.d.mts.map +1 -1
- package/dist/others/map-nullable.mjs.map +1 -1
- package/dist/others/memoize-function.d.mts +14 -157
- package/dist/others/memoize-function.d.mts.map +1 -1
- package/dist/others/memoize-function.mjs +14 -157
- package/dist/others/memoize-function.mjs.map +1 -1
- package/dist/others/tuple.d.mts +33 -151
- package/dist/others/tuple.d.mts.map +1 -1
- package/dist/others/tuple.mjs +33 -151
- package/dist/others/tuple.mjs.map +1 -1
- package/dist/others/unknown-to-string.d.mts +11 -125
- package/dist/others/unknown-to-string.d.mts.map +1 -1
- package/dist/others/unknown-to-string.mjs +12 -126
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/dist/promise/promise.d.mts +33 -20
- package/dist/promise/promise.d.mts.map +1 -1
- package/dist/promise/promise.mjs +34 -21
- package/dist/promise/promise.mjs.map +1 -1
- package/package.json +47 -39
- package/src/array/impl/array-utils-creation.mts +192 -0
- package/src/array/{array-utils-creation.test.mts → impl/array-utils-creation.test.mts} +121 -72
- package/src/array/impl/array-utils-element-access.mts +115 -0
- package/src/array/impl/array-utils-element-access.test.mts +151 -0
- package/src/array/impl/array-utils-iterators.mts +79 -0
- package/src/array/impl/array-utils-iterators.test.mts +98 -0
- package/src/array/impl/array-utils-modification.mts +434 -0
- package/src/array/{array-utils-modification.test.mts → impl/array-utils-modification.test.mts} +41 -28
- package/src/array/{array-utils-overload-type-error.test.mts → impl/array-utils-overload-type-error.test.mts} +33 -33
- package/src/array/impl/array-utils-reducing-value.mts +551 -0
- package/src/array/{array-utils-reducing-value.test.mts → impl/array-utils-reducing-value.test.mts} +45 -50
- package/src/array/impl/array-utils-search.mts +509 -0
- package/src/array/impl/array-utils-search.test.mts +346 -0
- package/src/array/impl/array-utils-set-op.mts +166 -0
- package/src/array/{array-utils-set-op.test.mts → impl/array-utils-set-op.test.mts} +42 -35
- package/src/array/impl/array-utils-size.mts +30 -0
- package/src/array/impl/array-utils-size.test.mts +9 -0
- package/src/array/impl/array-utils-slice-clamped.mts +51 -0
- package/src/array/{array-utils-slice-clamped.test.mts → impl/array-utils-slice-clamped.test.mts} +12 -12
- package/src/array/impl/array-utils-slicing.mts +275 -0
- package/src/array/impl/array-utils-slicing.test.mts +158 -0
- package/src/array/impl/array-utils-transformation.mts +746 -0
- package/src/array/{array-utils-transformation.test.mts → impl/array-utils-transformation.test.mts} +662 -889
- package/src/array/impl/array-utils-validation.mts +241 -0
- package/src/array/{array-utils-validation.test.mts → impl/array-utils-validation.test.mts} +194 -107
- package/src/array/{array.test.mts → impl/array.test.mts} +2 -2
- package/src/array/impl/index.mts +12 -0
- package/src/array/index.mts +1 -1
- package/src/collections/imap-mapped.mts +99 -265
- package/src/collections/imap.mts +477 -174
- package/src/collections/imap.test.mts +12 -19
- package/src/collections/iset-mapped.mts +892 -358
- package/src/collections/iset.mts +429 -213
- package/src/collections/queue.mts +174 -200
- package/src/collections/stack.mts +172 -245
- package/src/collections/stack.test.mts +9 -1
- package/src/entry-point.mts +1 -0
- package/src/expect-type.mts +43 -172
- package/src/functional/match.mts +35 -145
- package/src/functional/optional.mts +285 -163
- package/src/functional/optional.test.mts +4 -1
- package/src/functional/pipe.mts +60 -113
- package/src/functional/result.mts +452 -351
- package/src/functional/result.test.mts +9 -2
- package/src/globals.d.mts +12 -5
- package/src/guard/has-key.mts +23 -74
- package/src/guard/is-non-empty-string.mts +20 -87
- package/src/guard/is-non-null-object.mts +14 -84
- package/src/guard/is-non-null-object.test.mts +1 -1
- package/src/guard/is-primitive.mts +13 -126
- package/src/guard/is-primitive.test.mts +1 -1
- package/src/guard/is-record.mts +21 -132
- package/src/guard/is-type.mts +201 -238
- package/src/guard/is-type.test.mts +7 -7
- package/src/guard/key-is-in.mts +22 -139
- package/src/index.mts +0 -1
- package/src/iterator/range.mts +29 -62
- package/src/json/json.mts +202 -134
- package/src/json/json.test.mts +1 -3
- package/src/number/branded-types/finite-number.mts +27 -159
- package/src/number/branded-types/int.mts +122 -120
- package/src/number/branded-types/int16.mts +22 -30
- package/src/number/branded-types/int16.test.mts +24 -24
- package/src/number/branded-types/int32.mts +22 -31
- package/src/number/branded-types/int32.test.mts +39 -39
- package/src/number/branded-types/non-negative-finite-number.mts +31 -39
- package/src/number/branded-types/non-negative-int16.mts +24 -34
- package/src/number/branded-types/non-negative-int16.test.mts +16 -16
- package/src/number/branded-types/non-negative-int32.mts +26 -35
- package/src/number/branded-types/non-negative-int32.test.mts +30 -30
- package/src/number/branded-types/non-zero-finite-number.mts +25 -40
- package/src/number/branded-types/non-zero-int.mts +15 -30
- package/src/number/branded-types/non-zero-int16.mts +27 -35
- package/src/number/branded-types/non-zero-int16.test.mts +26 -26
- package/src/number/branded-types/non-zero-int32.mts +29 -36
- package/src/number/branded-types/non-zero-int32.test.mts +45 -42
- package/src/number/branded-types/non-zero-safe-int.mts +39 -40
- package/src/number/branded-types/non-zero-uint16.mts +24 -35
- package/src/number/branded-types/non-zero-uint16.test.mts +16 -16
- package/src/number/branded-types/non-zero-uint32.mts +24 -35
- package/src/number/branded-types/non-zero-uint32.test.mts +28 -28
- package/src/number/branded-types/positive-finite-number.mts +29 -43
- package/src/number/branded-types/positive-int.mts +134 -124
- package/src/number/branded-types/positive-int16.mts +24 -35
- package/src/number/branded-types/positive-int16.test.mts +14 -14
- package/src/number/branded-types/positive-int32.mts +24 -35
- package/src/number/branded-types/positive-int32.test.mts +26 -26
- package/src/number/branded-types/positive-safe-int.mts +160 -34
- package/src/number/branded-types/positive-uint16.mts +24 -35
- package/src/number/branded-types/positive-uint16.test.mts +16 -16
- package/src/number/branded-types/positive-uint32.mts +26 -36
- package/src/number/branded-types/positive-uint32.test.mts +31 -28
- package/src/number/branded-types/safe-int.mts +142 -101
- package/src/number/branded-types/safe-uint.mts +25 -34
- package/src/number/branded-types/uint.mts +121 -30
- package/src/number/branded-types/uint16.mts +26 -34
- package/src/number/branded-types/uint16.test.mts +16 -16
- package/src/number/branded-types/uint32.mts +26 -68
- package/src/number/branded-types/uint32.test.mts +28 -28
- package/src/number/enum/int8.mts +39 -170
- package/src/number/enum/uint8.mts +46 -155
- package/src/number/num.mts +157 -212
- package/src/number/num.test.mts +4 -4
- package/src/number/refined-number-utils.mts +109 -26
- package/src/object/object.mts +130 -212
- package/src/object/object.test.mts +29 -0
- package/src/others/cast-mutable.mts +13 -89
- package/src/others/cast-mutable.test.mts +80 -0
- package/src/others/cast-readonly.mts +13 -169
- package/src/others/if-then.mts +6 -83
- package/src/others/map-nullable.mts +12 -136
- package/src/others/map-nullable.test.mts +6 -6
- package/src/others/memoize-function.mts +14 -157
- package/src/others/tuple.mts +33 -151
- package/src/others/unknown-to-string.mts +12 -126
- package/src/others/unknown-to-string.test.mts +13 -1
- package/src/promise/promise.mts +34 -21
- package/src/promise/promise.test.mts +43 -0
- package/dist/array/array-utils.d.mts +0 -2956
- package/dist/array/array-utils.d.mts.map +0 -1
- package/dist/array/array-utils.mjs +0 -1838
- package/dist/array/array-utils.mjs.map +0 -1
- package/src/array/array-utils-search.test.mts +0 -169
- package/src/array/array-utils-slicing.test.mts +0 -274
- package/src/array/array-utils.mts +0 -4834
|
@@ -31,7 +31,9 @@ const {
|
|
|
31
31
|
} as const);
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Checks if a number is a PositiveUint32 (32-bit positive unsigned integer in
|
|
34
|
+
* Checks if a number is a PositiveUint32 (32-bit positive unsigned integer in
|
|
35
|
+
* the range [1, 2^32)).
|
|
36
|
+
*
|
|
35
37
|
* @param value The value to check.
|
|
36
38
|
* @returns `true` if the value is a PositiveUint32, `false` otherwise.
|
|
37
39
|
*/
|
|
@@ -39,70 +41,49 @@ export const isPositiveUint32 = is;
|
|
|
39
41
|
|
|
40
42
|
/**
|
|
41
43
|
* Casts a number to a PositiveUint32 type.
|
|
44
|
+
*
|
|
42
45
|
* @param value The value to cast.
|
|
43
46
|
* @returns The value as a PositiveUint32 type.
|
|
44
47
|
* @throws {TypeError} If the value is not a positive integer in [1, 2^32).
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* const x = asPositiveUint32(1000); // PositiveUint32
|
|
48
|
-
* const y = asPositiveUint32(4294967295); // PositiveUint32
|
|
49
|
-
* // asPositiveUint32(0); // throws TypeError
|
|
50
|
-
* // asPositiveUint32(-1); // throws TypeError
|
|
51
|
-
* // asPositiveUint32(4294967296); // throws TypeError
|
|
52
|
-
* ```
|
|
53
48
|
*/
|
|
54
49
|
export const asPositiveUint32 = castType;
|
|
55
50
|
|
|
56
51
|
/**
|
|
57
|
-
* Namespace providing type-safe arithmetic operations for 32-bit positive
|
|
58
|
-
*
|
|
59
|
-
* All operations automatically clamp results to the valid PositiveUint32 range [1, 4294967295].
|
|
60
|
-
* This ensures that all arithmetic maintains the 32-bit positive unsigned integer constraint,
|
|
61
|
-
* with results below 1 clamped to MIN_VALUE and overflow results clamped to MAX_VALUE.
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```typescript
|
|
65
|
-
* const a = asPositiveUint32(4000000000);
|
|
66
|
-
* const b = asPositiveUint32(1000000000);
|
|
67
|
-
*
|
|
68
|
-
* // Arithmetic operations with automatic clamping and positive constraint
|
|
69
|
-
* const sum = PositiveUint32.add(a, b); // PositiveUint32 (4294967295 - clamped to MAX_VALUE)
|
|
70
|
-
* const diff = PositiveUint32.sub(a, b); // PositiveUint32 (3000000000)
|
|
71
|
-
* const reverseDiff = PositiveUint32.sub(b, a); // PositiveUint32 (1 - clamped to MIN_VALUE)
|
|
72
|
-
* const product = PositiveUint32.mul(a, b); // PositiveUint32 (4294967295 - clamped due to overflow)
|
|
73
|
-
*
|
|
74
|
-
* // Range operations (maintaining positive constraint)
|
|
75
|
-
* const clamped = PositiveUint32.clamp(-100); // PositiveUint32 (1)
|
|
76
|
-
* const minimum = PositiveUint32.min(a, b); // PositiveUint32 (1000000000)
|
|
77
|
-
* const maximum = PositiveUint32.max(a, b); // PositiveUint32 (4000000000)
|
|
52
|
+
* Namespace providing type-safe arithmetic operations for 32-bit positive
|
|
53
|
+
* unsigned integers.
|
|
78
54
|
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
55
|
+
* All operations automatically clamp results to the valid PositiveUint32 range
|
|
56
|
+
* [1, 4294967295]. This ensures that all arithmetic maintains the 32-bit
|
|
57
|
+
* positive unsigned integer constraint, with results below 1 clamped to
|
|
58
|
+
* MIN_VALUE and overflow results clamped to MAX_VALUE.
|
|
83
59
|
*/
|
|
84
60
|
export const PositiveUint32 = {
|
|
85
61
|
/**
|
|
86
62
|
* Type guard to check if a value is a PositiveUint32.
|
|
63
|
+
*
|
|
87
64
|
* @param value The value to check.
|
|
88
|
-
* @returns `true` if the value is a 32-bit positive unsigned integer, `false`
|
|
65
|
+
* @returns `true` if the value is a 32-bit positive unsigned integer, `false`
|
|
66
|
+
* otherwise.
|
|
89
67
|
*/
|
|
90
68
|
is,
|
|
91
69
|
|
|
92
70
|
/**
|
|
93
71
|
* The minimum value for a 32-bit positive unsigned integer.
|
|
72
|
+
*
|
|
94
73
|
* @readonly
|
|
95
74
|
*/
|
|
96
75
|
MIN_VALUE,
|
|
97
76
|
|
|
98
77
|
/**
|
|
99
78
|
* The maximum value for a 32-bit positive unsigned integer.
|
|
79
|
+
*
|
|
100
80
|
* @readonly
|
|
101
81
|
*/
|
|
102
82
|
MAX_VALUE,
|
|
103
83
|
|
|
104
84
|
/**
|
|
105
85
|
* Returns the smaller of two PositiveUint32 values.
|
|
86
|
+
*
|
|
106
87
|
* @param a The first PositiveUint32.
|
|
107
88
|
* @param b The second PositiveUint32.
|
|
108
89
|
* @returns The minimum value as a PositiveUint32.
|
|
@@ -111,6 +92,7 @@ export const PositiveUint32 = {
|
|
|
111
92
|
|
|
112
93
|
/**
|
|
113
94
|
* Returns the larger of two PositiveUint32 values.
|
|
95
|
+
*
|
|
114
96
|
* @param a The first PositiveUint32.
|
|
115
97
|
* @param b The second PositiveUint32.
|
|
116
98
|
* @returns The maximum value as a PositiveUint32.
|
|
@@ -119,6 +101,7 @@ export const PositiveUint32 = {
|
|
|
119
101
|
|
|
120
102
|
/**
|
|
121
103
|
* Clamps a number to the PositiveUint32 range.
|
|
104
|
+
*
|
|
122
105
|
* @param value The number to clamp.
|
|
123
106
|
* @returns The value clamped to [1, 4294967295] as a PositiveUint32.
|
|
124
107
|
*/
|
|
@@ -126,12 +109,14 @@ export const PositiveUint32 = {
|
|
|
126
109
|
|
|
127
110
|
/**
|
|
128
111
|
* Generates a random PositiveUint32 value within the valid range.
|
|
112
|
+
*
|
|
129
113
|
* @returns A random PositiveUint32 between 1 and 4294967295.
|
|
130
114
|
*/
|
|
131
115
|
random,
|
|
132
116
|
|
|
133
117
|
/**
|
|
134
118
|
* Raises a PositiveUint32 to the power of another PositiveUint32.
|
|
119
|
+
*
|
|
135
120
|
* @param a The base PositiveUint32.
|
|
136
121
|
* @param b The exponent PositiveUint32.
|
|
137
122
|
* @returns `a ** b` clamped to [1, 4294967295] as a PositiveUint32.
|
|
@@ -140,6 +125,7 @@ export const PositiveUint32 = {
|
|
|
140
125
|
|
|
141
126
|
/**
|
|
142
127
|
* Adds two PositiveUint32 values.
|
|
128
|
+
*
|
|
143
129
|
* @param a The first PositiveUint32.
|
|
144
130
|
* @param b The second PositiveUint32.
|
|
145
131
|
* @returns `a + b` clamped to [1, 4294967295] as a PositiveUint32.
|
|
@@ -148,14 +134,17 @@ export const PositiveUint32 = {
|
|
|
148
134
|
|
|
149
135
|
/**
|
|
150
136
|
* Subtracts one PositiveUint32 from another.
|
|
137
|
+
*
|
|
151
138
|
* @param a The minuend PositiveUint32.
|
|
152
139
|
* @param b The subtrahend PositiveUint32.
|
|
153
|
-
* @returns `a - b` clamped to [1, 4294967295] as a PositiveUint32 (minimum
|
|
140
|
+
* @returns `a - b` clamped to [1, 4294967295] as a PositiveUint32 (minimum
|
|
141
|
+
* 1).
|
|
154
142
|
*/
|
|
155
143
|
sub,
|
|
156
144
|
|
|
157
145
|
/**
|
|
158
146
|
* Multiplies two PositiveUint32 values.
|
|
147
|
+
*
|
|
159
148
|
* @param a The first PositiveUint32.
|
|
160
149
|
* @param b The second PositiveUint32.
|
|
161
150
|
* @returns `a * b` clamped to [1, 4294967295] as a PositiveUint32.
|
|
@@ -164,6 +153,7 @@ export const PositiveUint32 = {
|
|
|
164
153
|
|
|
165
154
|
/**
|
|
166
155
|
* Divides one PositiveUint32 by another using floor division.
|
|
156
|
+
*
|
|
167
157
|
* @param a The dividend PositiveUint32.
|
|
168
158
|
* @param b The divisor PositiveUint32.
|
|
169
159
|
* @returns `⌊a / b⌋` clamped to [1, 4294967295] as a PositiveUint32.
|
|
@@ -11,8 +11,8 @@ describe('PositiveUint32', () => {
|
|
|
11
11
|
test('accepts valid positive uint32 values', () => {
|
|
12
12
|
expect(() => asPositiveUint32(1)).not.toThrow();
|
|
13
13
|
expect(() => asPositiveUint32(1000)).not.toThrow();
|
|
14
|
-
expect(() => asPositiveUint32(
|
|
15
|
-
expect(() => asPositiveUint32(
|
|
14
|
+
expect(() => asPositiveUint32(4_294_967_295)).not.toThrow(); // 2^32 - 1
|
|
15
|
+
expect(() => asPositiveUint32(2_147_483_648)).not.toThrow(); // 2^31
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
test('rejects zero', () => {
|
|
@@ -20,8 +20,8 @@ describe('PositiveUint32', () => {
|
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
test('rejects values outside uint32 range', () => {
|
|
23
|
-
expect(() => asPositiveUint32(
|
|
24
|
-
expect(() => asPositiveUint32(
|
|
23
|
+
expect(() => asPositiveUint32(4_294_967_296)).toThrow(TypeError); // 2^32
|
|
24
|
+
expect(() => asPositiveUint32(10_000_000_000)).toThrow(TypeError);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
test('rejects negative integers', () => {
|
|
@@ -44,7 +44,7 @@ describe('PositiveUint32', () => {
|
|
|
44
44
|
test('returns the same value for valid inputs', () => {
|
|
45
45
|
expect(asPositiveUint32(5)).toBe(5);
|
|
46
46
|
expect(asPositiveUint32(1)).toBe(1);
|
|
47
|
-
expect(asPositiveUint32(
|
|
47
|
+
expect(asPositiveUint32(4_294_967_295)).toBe(4_294_967_295);
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
test.each([
|
|
@@ -55,7 +55,7 @@ describe('PositiveUint32', () => {
|
|
|
55
55
|
{ name: '-3.4', value: -3.4 },
|
|
56
56
|
{ name: '0', value: 0 },
|
|
57
57
|
{ name: '-1', value: -1 },
|
|
58
|
-
{ name: '4294967296', value:
|
|
58
|
+
{ name: '4294967296', value: 4_294_967_296 },
|
|
59
59
|
] as const)(
|
|
60
60
|
`asPositiveUint32($name) should throw a TypeError`,
|
|
61
61
|
({ value }) => {
|
|
@@ -72,8 +72,8 @@ describe('PositiveUint32', () => {
|
|
|
72
72
|
test('correctly identifies positive uint32 values', () => {
|
|
73
73
|
expect(isPositiveUint32(1)).toBe(true);
|
|
74
74
|
expect(isPositiveUint32(1000)).toBe(true);
|
|
75
|
-
expect(isPositiveUint32(
|
|
76
|
-
expect(isPositiveUint32(
|
|
75
|
+
expect(isPositiveUint32(4_294_967_295)).toBe(true);
|
|
76
|
+
expect(isPositiveUint32(2_147_483_648)).toBe(true);
|
|
77
77
|
});
|
|
78
78
|
|
|
79
79
|
test('correctly identifies zero', () => {
|
|
@@ -81,8 +81,8 @@ describe('PositiveUint32', () => {
|
|
|
81
81
|
});
|
|
82
82
|
|
|
83
83
|
test('correctly identifies values outside uint32 range', () => {
|
|
84
|
-
expect(isPositiveUint32(
|
|
85
|
-
expect(isPositiveUint32(
|
|
84
|
+
expect(isPositiveUint32(4_294_967_296)).toBe(false);
|
|
85
|
+
expect(isPositiveUint32(10_000_000_000)).toBe(false);
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
test('correctly identifies negative integers', () => {
|
|
@@ -110,60 +110,63 @@ describe('PositiveUint32', () => {
|
|
|
110
110
|
describe('constants', () => {
|
|
111
111
|
test('MIN_VALUE and MAX_VALUE', () => {
|
|
112
112
|
expect(PositiveUint32.MIN_VALUE).toBe(1);
|
|
113
|
-
expect(PositiveUint32.MAX_VALUE).toBe(
|
|
113
|
+
expect(PositiveUint32.MAX_VALUE).toBe(4_294_967_295);
|
|
114
114
|
});
|
|
115
115
|
});
|
|
116
116
|
|
|
117
117
|
describe('mathematical operations', () => {
|
|
118
|
-
const a = asPositiveUint32(
|
|
119
|
-
const b = asPositiveUint32(
|
|
118
|
+
const a = asPositiveUint32(1_000_000);
|
|
119
|
+
const b = asPositiveUint32(500_000);
|
|
120
120
|
|
|
121
121
|
test('min and max', () => {
|
|
122
|
-
expect(PositiveUint32.min(a, b)).toBe(
|
|
123
|
-
expect(PositiveUint32.max(a, b)).toBe(
|
|
122
|
+
expect(PositiveUint32.min(a, b)).toBe(500_000);
|
|
123
|
+
expect(PositiveUint32.max(a, b)).toBe(1_000_000);
|
|
124
124
|
});
|
|
125
125
|
|
|
126
126
|
test('add (with clamping to positive uint32 range)', () => {
|
|
127
127
|
const result = PositiveUint32.add(
|
|
128
|
-
asPositiveUint32(
|
|
128
|
+
asPositiveUint32(4_294_967_000),
|
|
129
129
|
asPositiveUint32(1000),
|
|
130
130
|
);
|
|
131
|
-
expect(result).toBe(
|
|
132
|
-
expect(PositiveUint32.add(a, b)).toBe(
|
|
131
|
+
expect(result).toBe(4_294_967_295); // clamped to max
|
|
132
|
+
expect(PositiveUint32.add(a, b)).toBe(1_500_000);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
135
|
test('sub (never goes below 1)', () => {
|
|
136
|
-
expect(PositiveUint32.sub(a, b)).toBe(
|
|
136
|
+
expect(PositiveUint32.sub(a, b)).toBe(500_000);
|
|
137
137
|
expect(PositiveUint32.sub(b, a)).toBe(1); // clamped to 1
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
test('mul (with clamping to positive uint32 range)', () => {
|
|
141
141
|
const result = PositiveUint32.mul(
|
|
142
|
-
asPositiveUint32(
|
|
143
|
-
asPositiveUint32(
|
|
142
|
+
asPositiveUint32(100_000),
|
|
143
|
+
asPositiveUint32(100_000),
|
|
144
144
|
);
|
|
145
|
-
expect(result).toBe(
|
|
145
|
+
expect(result).toBe(4_294_967_295); // clamped to max
|
|
146
146
|
expect(
|
|
147
147
|
PositiveUint32.mul(asPositiveUint32(1000), asPositiveUint32(5)),
|
|
148
148
|
).toBe(5000);
|
|
149
149
|
});
|
|
150
150
|
|
|
151
151
|
test('div (floor division, never goes below 1)', () => {
|
|
152
|
-
expect(PositiveUint32.div(a, asPositiveUint32(
|
|
152
|
+
expect(PositiveUint32.div(a, asPositiveUint32(500_000))).toBe(2);
|
|
153
153
|
expect(PositiveUint32.div(asPositiveUint32(7), asPositiveUint32(3))).toBe(
|
|
154
154
|
2,
|
|
155
155
|
);
|
|
156
156
|
expect(
|
|
157
|
-
PositiveUint32.div(
|
|
157
|
+
PositiveUint32.div(
|
|
158
|
+
asPositiveUint32(500_000),
|
|
159
|
+
asPositiveUint32(1_000_000),
|
|
160
|
+
),
|
|
158
161
|
).toBe(1); // floor(500000/1000000) = 0, clamped to 1
|
|
159
162
|
});
|
|
160
163
|
|
|
161
164
|
test('pow (with clamping to positive uint32 range)', () => {
|
|
162
165
|
const result = PositiveUint32.pow(
|
|
163
|
-
asPositiveUint32(
|
|
166
|
+
asPositiveUint32(10_000),
|
|
164
167
|
asPositiveUint32(3),
|
|
165
168
|
);
|
|
166
|
-
expect(result).toBe(
|
|
169
|
+
expect(result).toBe(4_294_967_295); // clamped to max
|
|
167
170
|
expect(PositiveUint32.pow(asPositiveUint32(2), asPositiveUint32(3))).toBe(
|
|
168
171
|
8,
|
|
169
172
|
);
|
|
@@ -189,7 +192,7 @@ describe('PositiveUint32', () => {
|
|
|
189
192
|
for (const _ of range(10)) {
|
|
190
193
|
const result = PositiveUint32.random(1, 30);
|
|
191
194
|
expect(result).toBeGreaterThanOrEqual(1);
|
|
192
|
-
expect(result).toBeLessThanOrEqual(
|
|
195
|
+
expect(result).toBeLessThanOrEqual(4_294_967_295);
|
|
193
196
|
}
|
|
194
197
|
});
|
|
195
198
|
});
|
|
@@ -198,7 +201,7 @@ describe('PositiveUint32', () => {
|
|
|
198
201
|
test('type relationships', () => {
|
|
199
202
|
expectType<PositiveUint32, number>('<=');
|
|
200
203
|
|
|
201
|
-
expectTypeOf(asPositiveUint32(
|
|
204
|
+
expectTypeOf(asPositiveUint32(1_000_000)).toExtend<PositiveUint32>();
|
|
202
205
|
});
|
|
203
206
|
});
|
|
204
207
|
});
|
|
@@ -26,9 +26,9 @@ const {
|
|
|
26
26
|
SafeUint
|
|
27
27
|
>({
|
|
28
28
|
integerOrSafeInteger: 'SafeInteger',
|
|
29
|
-
// eslint-disable-next-line
|
|
29
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
30
30
|
MIN_VALUE: Number.MIN_SAFE_INTEGER as SafeInt,
|
|
31
|
-
// eslint-disable-next-line
|
|
31
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
32
32
|
MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
|
|
33
33
|
typeNameInMessage,
|
|
34
34
|
} as const);
|
|
@@ -39,17 +39,16 @@ const {
|
|
|
39
39
|
* A safe integer is an integer that can be exactly represented in JavaScript
|
|
40
40
|
* without precision loss. The range is [±(2^53 - 1)].
|
|
41
41
|
*
|
|
42
|
-
* @param value - The value to check
|
|
43
|
-
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
44
|
-
*
|
|
45
42
|
* @example
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* isSafeInt(Number.MAX_SAFE_INTEGER);
|
|
49
|
-
* isSafeInt(Number.MAX_SAFE_INTEGER +
|
|
50
|
-
*
|
|
51
|
-
* isSafeInt(NaN); // false
|
|
43
|
+
*
|
|
44
|
+
* ```ts
|
|
45
|
+
* assert.ok(isSafeInt(Number.MAX_SAFE_INTEGER));
|
|
46
|
+
* assert.notOk(isSafeInt(Number.MAX_SAFE_INTEGER + 0.5));
|
|
47
|
+
* assert.ok(SafeInt.is(Number.MIN_SAFE_INTEGER));
|
|
52
48
|
* ```
|
|
49
|
+
*
|
|
50
|
+
* @param value - The value to check
|
|
51
|
+
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
53
52
|
*/
|
|
54
53
|
export const isSafeInt = is;
|
|
55
54
|
|
|
@@ -57,24 +56,21 @@ export const isSafeInt = is;
|
|
|
57
56
|
* Casts a number to a SafeInt branded type.
|
|
58
57
|
*
|
|
59
58
|
* This function validates that the input is a safe integer (within ±(2^53 - 1))
|
|
60
|
-
* and returns it with the SafeInt brand. This ensures type safety for
|
|
61
|
-
* that require precise integer arithmetic.
|
|
62
|
-
*
|
|
63
|
-
* @param value - The value to cast
|
|
64
|
-
* @returns The value as a SafeInt branded type
|
|
65
|
-
* @throws {TypeError} If the value is not a safe integer
|
|
59
|
+
* and returns it with the SafeInt brand. This ensures type safety for
|
|
60
|
+
* operations that require precise integer arithmetic.
|
|
66
61
|
*
|
|
67
62
|
* @example
|
|
68
|
-
* ```typescript
|
|
69
|
-
* const x = asSafeInt(5); // SafeInt
|
|
70
|
-
* const y = asSafeInt(-1000); // SafeInt
|
|
71
|
-
* const z = asSafeInt(2**50); // SafeInt (within range)
|
|
72
63
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
64
|
+
* ```ts
|
|
65
|
+
* const branded = asSafeInt(123);
|
|
66
|
+
*
|
|
67
|
+
* assert(branded === 123);
|
|
68
|
+
* assert.ok(SafeInt.is(branded));
|
|
77
69
|
* ```
|
|
70
|
+
*
|
|
71
|
+
* @param value - The value to cast
|
|
72
|
+
* @returns The value as a SafeInt branded type
|
|
73
|
+
* @throws {TypeError} If the value is not a safe integer
|
|
78
74
|
*/
|
|
79
75
|
export const asSafeInt = castType;
|
|
80
76
|
|
|
@@ -86,58 +82,42 @@ export const asSafeInt = castType;
|
|
|
86
82
|
* approximately ±9 quadrillion.
|
|
87
83
|
*
|
|
88
84
|
* All operations automatically clamp results to stay within the safe range,
|
|
89
|
-
* preventing precision loss that occurs with larger integers. This makes
|
|
90
|
-
* ideal for:
|
|
85
|
+
* preventing precision loss that occurs with larger integers. This makes
|
|
86
|
+
* SafeInt ideal for:
|
|
87
|
+
*
|
|
91
88
|
* - Financial calculations requiring exact cents
|
|
92
89
|
* - Database IDs and counters
|
|
93
90
|
* - Array indices and sizes
|
|
94
91
|
* - Any integer arithmetic requiring precision guarantees
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```typescript
|
|
98
|
-
* // Near the boundary
|
|
99
|
-
* const nearMax = asSafeInt(9007199254740990);
|
|
100
|
-
* const increment = asSafeInt(10);
|
|
101
|
-
*
|
|
102
|
-
* // Automatic clamping prevents precision loss
|
|
103
|
-
* const sum = SafeInt.add(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
104
|
-
* const product = SafeInt.mul(nearMax, increment); // Clamped to MAX_SAFE_INTEGER
|
|
105
|
-
*
|
|
106
|
-
* // Safe operations
|
|
107
|
-
* const a = asSafeInt(1000000);
|
|
108
|
-
* const b = asSafeInt(500);
|
|
109
|
-
*
|
|
110
|
-
* const diff = SafeInt.sub(a, b); // SafeInt (999500)
|
|
111
|
-
* const quotient = SafeInt.div(a, b); // SafeInt (2000)
|
|
112
|
-
* const power = SafeInt.pow(b, asSafeInt(2)); // SafeInt (250000)
|
|
113
|
-
*
|
|
114
|
-
* // Utility operations
|
|
115
|
-
* const absolute = SafeInt.abs(asSafeInt(-42)); // SafeInt (42)
|
|
116
|
-
* const clamped = SafeInt.clamp(2**60); // SafeInt (MAX_SAFE_INTEGER)
|
|
117
|
-
*
|
|
118
|
-
* // Random generation
|
|
119
|
-
* const die = SafeInt.random(asSafeInt(1), asSafeInt(6)); // Random 1-6
|
|
120
|
-
* ```
|
|
121
92
|
*/
|
|
122
93
|
export const SafeInt = {
|
|
123
94
|
/**
|
|
124
95
|
* Type guard that checks if a value is a safe integer.
|
|
125
96
|
*
|
|
97
|
+
* @example
|
|
98
|
+
*
|
|
99
|
+
* ```ts
|
|
100
|
+
* assert.ok(isSafeInt(Number.MAX_SAFE_INTEGER));
|
|
101
|
+
* assert.notOk(isSafeInt(Number.MAX_SAFE_INTEGER + 0.5));
|
|
102
|
+
* assert.ok(SafeInt.is(Number.MIN_SAFE_INTEGER));
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
126
105
|
* @param value - The value to check
|
|
127
106
|
* @returns `true` if the value is a safe integer, `false` otherwise
|
|
128
|
-
*
|
|
129
107
|
* @see {@link isSafeInt} for usage examples
|
|
130
108
|
*/
|
|
131
109
|
is,
|
|
132
110
|
|
|
133
111
|
/**
|
|
134
112
|
* The minimum safe integer value (-(2^53 - 1)).
|
|
113
|
+
*
|
|
135
114
|
* @readonly
|
|
136
115
|
*/
|
|
137
116
|
MIN_VALUE,
|
|
138
117
|
|
|
139
118
|
/**
|
|
140
119
|
* The maximum safe integer value (2^53 - 1).
|
|
120
|
+
*
|
|
141
121
|
* @readonly
|
|
142
122
|
*/
|
|
143
123
|
MAX_VALUE,
|
|
@@ -145,81 +125,114 @@ export const SafeInt = {
|
|
|
145
125
|
/**
|
|
146
126
|
* Returns the absolute value of a safe integer.
|
|
147
127
|
*
|
|
148
|
-
* Note: `Math.abs(MIN_SAFE_INTEGER)` would exceed `MAX_SAFE_INTEGER`,
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* @param a - The safe integer value
|
|
152
|
-
* @returns The absolute value as a SafeInt, clamped if necessary
|
|
128
|
+
* Note: `Math.abs(MIN_SAFE_INTEGER)` would exceed `MAX_SAFE_INTEGER`, so this
|
|
129
|
+
* function clamps the result to maintain the safe integer guarantee.
|
|
153
130
|
*
|
|
154
131
|
* @example
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* SafeInt.abs(
|
|
132
|
+
*
|
|
133
|
+
* ```ts
|
|
134
|
+
* const negative = asSafeInt(-900);
|
|
135
|
+
* const absolute = SafeInt.abs(negative);
|
|
136
|
+
*
|
|
137
|
+
* assert(absolute === 900);
|
|
138
|
+
* assert.ok(SafeInt.is(absolute));
|
|
159
139
|
* ```
|
|
140
|
+
*
|
|
141
|
+
* @param a - The safe integer value
|
|
142
|
+
* @returns The absolute value as a SafeInt, clamped if necessary
|
|
160
143
|
*/
|
|
161
144
|
abs,
|
|
162
145
|
|
|
163
146
|
/**
|
|
164
147
|
* Returns the minimum value from a list of safe integers.
|
|
165
148
|
*
|
|
166
|
-
* @param values - The safe integers to compare (at least one required)
|
|
167
|
-
* @returns The smallest value as a SafeInt
|
|
168
|
-
*
|
|
169
149
|
* @example
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* SafeInt.min(asSafeInt(
|
|
150
|
+
*
|
|
151
|
+
* ```ts
|
|
152
|
+
* const smallest = SafeInt.min(asSafeInt(25), asSafeInt(-14), asSafeInt(99));
|
|
153
|
+
*
|
|
154
|
+
* assert(smallest === -14);
|
|
173
155
|
* ```
|
|
156
|
+
*
|
|
157
|
+
* @param values - The safe integers to compare (at least one required)
|
|
158
|
+
* @returns The smallest value as a SafeInt
|
|
174
159
|
*/
|
|
175
160
|
min: min_,
|
|
176
161
|
|
|
177
162
|
/**
|
|
178
163
|
* Returns the maximum value from a list of safe integers.
|
|
179
164
|
*
|
|
180
|
-
* @param values - The safe integers to compare (at least one required)
|
|
181
|
-
* @returns The largest value as a SafeInt
|
|
182
|
-
*
|
|
183
165
|
* @example
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
* SafeInt.max(asSafeInt(
|
|
166
|
+
*
|
|
167
|
+
* ```ts
|
|
168
|
+
* const largest = SafeInt.max(asSafeInt(25), asSafeInt(-14), asSafeInt(99));
|
|
169
|
+
*
|
|
170
|
+
* assert(largest === 99);
|
|
187
171
|
* ```
|
|
172
|
+
*
|
|
173
|
+
* @param values - The safe integers to compare (at least one required)
|
|
174
|
+
* @returns The largest value as a SafeInt
|
|
188
175
|
*/
|
|
189
176
|
max: max_,
|
|
190
177
|
|
|
191
178
|
/**
|
|
192
179
|
* Clamps a number to the safe integer range.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
*
|
|
183
|
+
* ```ts
|
|
184
|
+
* const aboveRange = SafeInt.clamp(1e20);
|
|
185
|
+
* const withinRange = SafeInt.clamp(123);
|
|
186
|
+
* const belowRange = SafeInt.clamp(-1e20);
|
|
187
|
+
*
|
|
188
|
+
* assert(aboveRange === Number.MAX_SAFE_INTEGER);
|
|
189
|
+
* assert(withinRange === 123);
|
|
190
|
+
* assert(belowRange === Number.MIN_SAFE_INTEGER);
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
193
193
|
* @param value The number to clamp.
|
|
194
|
-
* @returns The value clamped to [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER] as a
|
|
194
|
+
* @returns The value clamped to [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER] as a
|
|
195
|
+
* SafeInt.
|
|
195
196
|
*/
|
|
196
197
|
clamp,
|
|
197
198
|
|
|
198
199
|
/**
|
|
199
200
|
* Generates a random safe integer within the specified range (inclusive).
|
|
200
201
|
*
|
|
201
|
-
* The range is inclusive on both ends. If min > max, they are automatically
|
|
202
|
-
*
|
|
203
|
-
* @param min - The minimum value (inclusive)
|
|
204
|
-
* @param max - The maximum value (inclusive)
|
|
205
|
-
* @returns A random SafeInt in the range [min, max]
|
|
202
|
+
* The range is inclusive on both ends. If min > max, they are automatically
|
|
203
|
+
* swapped.
|
|
206
204
|
*
|
|
207
205
|
* @example
|
|
208
|
-
* ```typescript
|
|
209
|
-
* // Dice roll
|
|
210
|
-
* const d20 = SafeInt.random(asSafeInt(1), asSafeInt(20));
|
|
211
206
|
*
|
|
212
|
-
*
|
|
213
|
-
* const
|
|
207
|
+
* ```ts
|
|
208
|
+
* const min = asSafeInt(-10);
|
|
209
|
+
* const max = asSafeInt(10);
|
|
210
|
+
* const randomValue = SafeInt.random(min, max);
|
|
214
211
|
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
212
|
+
* assert.ok(SafeInt.is(randomValue));
|
|
213
|
+
* assert.ok(randomValue >= -10 && randomValue <= 10);
|
|
217
214
|
* ```
|
|
215
|
+
*
|
|
216
|
+
* @param min - The minimum value (inclusive)
|
|
217
|
+
* @param max - The maximum value (inclusive)
|
|
218
|
+
* @returns A random SafeInt in the range [min, max]
|
|
218
219
|
*/
|
|
219
220
|
random,
|
|
220
221
|
|
|
221
222
|
/**
|
|
222
223
|
* Raises a SafeInt to the power of another SafeInt.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
*
|
|
227
|
+
* ```ts
|
|
228
|
+
* const base = asSafeInt(3);
|
|
229
|
+
* const exponent = asSafeInt(5);
|
|
230
|
+
* const power = SafeInt.pow(base, exponent);
|
|
231
|
+
*
|
|
232
|
+
* assert(power === 243);
|
|
233
|
+
* assert.ok(SafeInt.is(power));
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
223
236
|
* @param a The base SafeInt.
|
|
224
237
|
* @param b The exponent SafeInt.
|
|
225
238
|
* @returns `a ** b` clamped to safe integer range as a SafeInt.
|
|
@@ -228,6 +241,16 @@ export const SafeInt = {
|
|
|
228
241
|
|
|
229
242
|
/**
|
|
230
243
|
* Adds two SafeInt values.
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
*
|
|
247
|
+
* ```ts
|
|
248
|
+
* const sum = SafeInt.add(asSafeInt(9), asSafeInt(4));
|
|
249
|
+
*
|
|
250
|
+
* assert(sum === 13);
|
|
251
|
+
* assert.ok(SafeInt.is(sum));
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
231
254
|
* @param a The first SafeInt.
|
|
232
255
|
* @param b The second SafeInt.
|
|
233
256
|
* @returns `a + b` clamped to safe integer range as a SafeInt.
|
|
@@ -236,6 +259,16 @@ export const SafeInt = {
|
|
|
236
259
|
|
|
237
260
|
/**
|
|
238
261
|
* Subtracts one SafeInt from another.
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
*
|
|
265
|
+
* ```ts
|
|
266
|
+
* const difference = SafeInt.sub(asSafeInt(9), asSafeInt(14));
|
|
267
|
+
*
|
|
268
|
+
* assert(difference === -5);
|
|
269
|
+
* assert.ok(SafeInt.is(difference));
|
|
270
|
+
* ```
|
|
271
|
+
*
|
|
239
272
|
* @param a The minuend SafeInt.
|
|
240
273
|
* @param b The subtrahend SafeInt.
|
|
241
274
|
* @returns `a - b` clamped to safe integer range as a SafeInt.
|
|
@@ -244,6 +277,16 @@ export const SafeInt = {
|
|
|
244
277
|
|
|
245
278
|
/**
|
|
246
279
|
* Multiplies two SafeInt values.
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
*
|
|
283
|
+
* ```ts
|
|
284
|
+
* const product = SafeInt.mul(asSafeInt(-8), asSafeInt(7));
|
|
285
|
+
*
|
|
286
|
+
* assert(product === -56);
|
|
287
|
+
* assert.ok(SafeInt.is(product));
|
|
288
|
+
* ```
|
|
289
|
+
*
|
|
247
290
|
* @param a The first SafeInt.
|
|
248
291
|
* @param b The second SafeInt.
|
|
249
292
|
* @returns `a * b` clamped to safe integer range as a SafeInt.
|
|
@@ -253,23 +296,21 @@ export const SafeInt = {
|
|
|
253
296
|
/**
|
|
254
297
|
* Divides one SafeInt by another using floor division.
|
|
255
298
|
*
|
|
256
|
-
* Performs mathematical floor division: `⌊a / b⌋`.
|
|
257
|
-
*
|
|
299
|
+
* Performs mathematical floor division: `⌊a / b⌋`. The divisor must be
|
|
300
|
+
* non-zero (enforced by type constraints).
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
*
|
|
304
|
+
* ```ts
|
|
305
|
+
* const quotient = SafeInt.div(asSafeInt(-17), asSafeInt(5));
|
|
306
|
+
*
|
|
307
|
+
* assert(quotient === -4);
|
|
308
|
+
* assert.ok(SafeInt.is(quotient));
|
|
309
|
+
* ```
|
|
258
310
|
*
|
|
259
311
|
* @param a - The dividend
|
|
260
312
|
* @param b - The divisor (must be non-zero)
|
|
261
313
|
* @returns The integer quotient as a SafeInt
|
|
262
|
-
*
|
|
263
|
-
* @example
|
|
264
|
-
* ```typescript
|
|
265
|
-
* SafeInt.div(asSafeInt(10), asSafeInt(3)); // SafeInt (3)
|
|
266
|
-
* SafeInt.div(asSafeInt(-10), asSafeInt(3)); // SafeInt (-4)
|
|
267
|
-
*
|
|
268
|
-
* // Large number division
|
|
269
|
-
* const large = asSafeInt(1000000000000);
|
|
270
|
-
* const divisor = asSafeInt(1000000);
|
|
271
|
-
* SafeInt.div(large, divisor); // SafeInt (1000000)
|
|
272
|
-
* ```
|
|
273
314
|
*/
|
|
274
315
|
div,
|
|
275
316
|
} as const;
|