ts-data-forge 3.2.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 +45 -21
- 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 +3 -0
- package/dist/entry-point.d.mts.map +1 -0
- package/dist/entry-point.mjs +62 -0
- package/dist/entry-point.mjs.map +1 -0
- 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 +14 -127
- 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/dist/types.d.mts +1 -1
- package/package.json +54 -50
- 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 +2 -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-record.test.mts +0 -1
- 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 +15 -127
- package/src/others/unknown-to-string.test.mts +14 -2
- 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
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { asPositiveUint32 } from '../../number/index.mjs';
|
|
2
|
+
import { castMutable } from '../../others/index.mjs';
|
|
3
|
+
import { copy, create } from './array-utils-creation.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns a new array with an element at the specified index replaced.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* const scores: number[] = [10, 20, 30];
|
|
12
|
+
*
|
|
13
|
+
* const updated = Arr.set(scores, 1, 25);
|
|
14
|
+
*
|
|
15
|
+
* assert.deepStrictEqual(updated, [10, 25, 30]);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function set<const Ar extends readonly unknown[], const V = Ar[number]>(
|
|
19
|
+
array: Ar,
|
|
20
|
+
index: ArgArrayIndex<Ar>,
|
|
21
|
+
newValue: V,
|
|
22
|
+
): IsFixedLengthList<Ar> extends true
|
|
23
|
+
? Readonly<{ [K in keyof Ar]: Ar[K] | V }>
|
|
24
|
+
: Ar extends NonEmptyArray<unknown>
|
|
25
|
+
? NonEmptyArray<Ar[number] | V>
|
|
26
|
+
: readonly (Ar[number] | V)[];
|
|
27
|
+
|
|
28
|
+
// curried version
|
|
29
|
+
export function set<const V>(
|
|
30
|
+
index: SizeType.ArgArr,
|
|
31
|
+
newValue: V,
|
|
32
|
+
): <const Ar extends readonly unknown[]>(
|
|
33
|
+
array: Ar,
|
|
34
|
+
) => IsFixedLengthList<Ar> extends true
|
|
35
|
+
? Readonly<{ [K in keyof Ar]: Ar[K] | V }>
|
|
36
|
+
: Ar extends NonEmptyArray<unknown>
|
|
37
|
+
? NonEmptyArray<Ar[number] | V>
|
|
38
|
+
: readonly (Ar[number] | V)[];
|
|
39
|
+
|
|
40
|
+
export function set<E, const V = E>(
|
|
41
|
+
...args:
|
|
42
|
+
| readonly [array: readonly E[], index: SizeType.ArgArr, newValue: V]
|
|
43
|
+
| readonly [index: SizeType.ArgArr, newValue: V]
|
|
44
|
+
): readonly (E | V)[] | ((array: readonly E[]) => readonly (E | V)[]) {
|
|
45
|
+
switch (args.length) {
|
|
46
|
+
case 3: {
|
|
47
|
+
const [array, index, newValue] = args;
|
|
48
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
49
|
+
return (array as (E | V)[]).with(index, newValue);
|
|
50
|
+
}
|
|
51
|
+
case 2: {
|
|
52
|
+
const [index, newValue] = args;
|
|
53
|
+
return (array) => set(array, index, newValue);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Returns a new array with an element at the specified index updated by applying a function.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
*
|
|
63
|
+
* ```ts
|
|
64
|
+
* const temperatures: number[] = [20, 21, 22];
|
|
65
|
+
*
|
|
66
|
+
* const increased = Arr.toUpdated(temperatures, 1, (value) => value + 5);
|
|
67
|
+
* const incrementLast = Arr.toUpdated<number>(
|
|
68
|
+
* 2,
|
|
69
|
+
* (value) => value + 1,
|
|
70
|
+
* )(temperatures);
|
|
71
|
+
*
|
|
72
|
+
* assert.deepStrictEqual(increased, [20, 26, 22]);
|
|
73
|
+
* assert.deepStrictEqual(incrementLast, [20, 21, 23]);
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export function toUpdated<
|
|
77
|
+
const Ar extends readonly unknown[],
|
|
78
|
+
const V = Ar[number],
|
|
79
|
+
>(
|
|
80
|
+
array: Ar,
|
|
81
|
+
index: ArgArrayIndex<Ar>,
|
|
82
|
+
updater: (prev: Ar[number]) => V,
|
|
83
|
+
): IsFixedLengthList<Ar> extends true
|
|
84
|
+
? Readonly<{ [K in keyof Ar]: Ar[K] | V }>
|
|
85
|
+
: Ar extends NonEmptyArray<unknown>
|
|
86
|
+
? NonEmptyArray<Ar[number] | V>
|
|
87
|
+
: readonly (Ar[number] | V)[];
|
|
88
|
+
|
|
89
|
+
// curried version
|
|
90
|
+
export function toUpdated<E, const V = E>(
|
|
91
|
+
index: SizeType.ArgArr,
|
|
92
|
+
updater: (prev: E) => V,
|
|
93
|
+
): <const Ar extends readonly E[]>(
|
|
94
|
+
array: Ar,
|
|
95
|
+
) => IsFixedLengthList<Ar> extends true
|
|
96
|
+
? Readonly<{ [K in keyof Ar]: Ar[K] | V }>
|
|
97
|
+
: Ar extends NonEmptyArray<unknown>
|
|
98
|
+
? NonEmptyArray<Ar[number] | V>
|
|
99
|
+
: readonly (Ar[number] | V)[];
|
|
100
|
+
|
|
101
|
+
export function toUpdated<E, V = E>(
|
|
102
|
+
...args:
|
|
103
|
+
| readonly [
|
|
104
|
+
array: readonly E[],
|
|
105
|
+
index: SizeType.ArgArr,
|
|
106
|
+
updater: (prev: E) => V,
|
|
107
|
+
]
|
|
108
|
+
| readonly [index: SizeType.ArgArr, updater: (prev: E) => V]
|
|
109
|
+
): readonly (E | V)[] | ((array: readonly E[]) => readonly (E | V)[]) {
|
|
110
|
+
switch (args.length) {
|
|
111
|
+
case 3: {
|
|
112
|
+
const [array, index, updater] = args;
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, total-functions/no-unsafe-type-assertion
|
|
114
|
+
return (array as (E | V)[]).with(index, updater(array[index]!));
|
|
115
|
+
}
|
|
116
|
+
case 2: {
|
|
117
|
+
const [index, updater] = args;
|
|
118
|
+
return (array) => toUpdated(array, index, updater);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Returns a new array with a value inserted at the specified index.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
*
|
|
128
|
+
* ```ts
|
|
129
|
+
* const numbers = [1, 2, 4] as const;
|
|
130
|
+
*
|
|
131
|
+
* const withThree = Arr.toInserted(numbers, 2, 3);
|
|
132
|
+
* const appendFive = Arr.toInserted(3, 5)(numbers);
|
|
133
|
+
*
|
|
134
|
+
* assert.deepStrictEqual(withThree, [1, 2, 3, 4]);
|
|
135
|
+
* assert.deepStrictEqual(appendFive, [1, 2, 4, 5]);
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export function toInserted<
|
|
139
|
+
const Ar extends readonly unknown[],
|
|
140
|
+
const V = Ar[number],
|
|
141
|
+
>(
|
|
142
|
+
array: Ar,
|
|
143
|
+
index: ArgArrayIndexWithNegative<Ar>,
|
|
144
|
+
newValue: V,
|
|
145
|
+
): IsFixedLengthList<Ar> extends true
|
|
146
|
+
? ArrayOfLength<CastToNumber<Increment<Ar['length']>>, Ar[number] | V>
|
|
147
|
+
: NonEmptyArray<Ar[number] | V>;
|
|
148
|
+
|
|
149
|
+
// curried version
|
|
150
|
+
export function toInserted<const V>(
|
|
151
|
+
index: SizeType.ArgArrWithNegative,
|
|
152
|
+
newValue: V,
|
|
153
|
+
): <const Ar extends readonly unknown[]>(
|
|
154
|
+
array: Ar,
|
|
155
|
+
) => IsFixedLengthList<Ar> extends true
|
|
156
|
+
? ArrayOfLength<CastToNumber<Increment<Ar['length']>>, Ar[number] | V>
|
|
157
|
+
: NonEmptyArray<Ar[number] | V>;
|
|
158
|
+
|
|
159
|
+
export function toInserted<E, const V = E>(
|
|
160
|
+
...args:
|
|
161
|
+
| readonly [
|
|
162
|
+
array: readonly E[],
|
|
163
|
+
index: SizeType.ArgArrWithNegative,
|
|
164
|
+
newValue: V,
|
|
165
|
+
]
|
|
166
|
+
| readonly [index: SizeType.ArgArrWithNegative, newValue: V]
|
|
167
|
+
): NonEmptyArray<E | V> | ((array: readonly E[]) => NonEmptyArray<E | V>) {
|
|
168
|
+
switch (args.length) {
|
|
169
|
+
case 3: {
|
|
170
|
+
const [array, index, newValue] = args;
|
|
171
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
172
|
+
return (array as readonly (E | V)[]).toSpliced(
|
|
173
|
+
index,
|
|
174
|
+
0,
|
|
175
|
+
newValue,
|
|
176
|
+
) as unknown as NonEmptyArray<E | V>;
|
|
177
|
+
}
|
|
178
|
+
case 2: {
|
|
179
|
+
const [index, newValue] = args;
|
|
180
|
+
return (array) => toInserted(array, index, newValue);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
type CastToNumber<T> = T extends number ? T : never;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Returns a new array with the element at the specified index removed.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
*
|
|
192
|
+
* ```ts
|
|
193
|
+
* const letters = ['a', 'b', 'c', 'd'] as const;
|
|
194
|
+
*
|
|
195
|
+
* const withoutSecond = Arr.toRemoved(letters, 1);
|
|
196
|
+
* const withoutFirstCurried = Arr.toRemoved(0)(letters);
|
|
197
|
+
*
|
|
198
|
+
* assert.deepStrictEqual(withoutSecond, ['a', 'c', 'd']);
|
|
199
|
+
* assert.deepStrictEqual(withoutFirstCurried, ['b', 'c', 'd']);
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export function toRemoved<const Ar extends readonly unknown[]>(
|
|
203
|
+
array: Ar,
|
|
204
|
+
index: ArgArrayIndexWithNegative<Ar>,
|
|
205
|
+
): readonly Ar[number][];
|
|
206
|
+
|
|
207
|
+
export function toRemoved(
|
|
208
|
+
index: SizeType.ArgArrWithNegative,
|
|
209
|
+
): <E>(array: readonly E[]) => readonly E[];
|
|
210
|
+
|
|
211
|
+
export function toRemoved<E>(
|
|
212
|
+
...args:
|
|
213
|
+
| readonly [array: readonly E[], index: SizeType.ArgArrWithNegative]
|
|
214
|
+
| readonly [index: SizeType.ArgArrWithNegative]
|
|
215
|
+
): readonly E[] | ((array: readonly E[]) => readonly E[]) {
|
|
216
|
+
switch (args.length) {
|
|
217
|
+
case 2: {
|
|
218
|
+
const [array, index] = args;
|
|
219
|
+
return array.toSpliced(index, 1);
|
|
220
|
+
}
|
|
221
|
+
case 1: {
|
|
222
|
+
const [index] = args;
|
|
223
|
+
return (array) => toRemoved(array, index);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Returns a new array with a value appended to the end.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
*
|
|
233
|
+
* ```ts
|
|
234
|
+
* const base = [1, 2] as const;
|
|
235
|
+
*
|
|
236
|
+
* const appended = Arr.toPushed(base, 3);
|
|
237
|
+
* const appendedCurried = Arr.toPushed(4)(base);
|
|
238
|
+
*
|
|
239
|
+
* assert.deepStrictEqual(appended, [1, 2, 3]);
|
|
240
|
+
* assert.deepStrictEqual(appendedCurried, [1, 2, 4]);
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
export function toPushed<const Ar extends readonly unknown[], const V>(
|
|
244
|
+
array: Ar,
|
|
245
|
+
newValue: V,
|
|
246
|
+
): readonly [...Ar, V];
|
|
247
|
+
|
|
248
|
+
export function toPushed<const V>(
|
|
249
|
+
newValue: V,
|
|
250
|
+
): <const Ar extends readonly unknown[]>(array: Ar) => readonly [...Ar, V];
|
|
251
|
+
|
|
252
|
+
export function toPushed<const Ar extends readonly unknown[], const V>(
|
|
253
|
+
...args: readonly [array: Ar, newValue: V] | readonly [newValue: V]
|
|
254
|
+
): readonly [...Ar, V] | ((array: Ar) => readonly [...Ar, V]) {
|
|
255
|
+
switch (args.length) {
|
|
256
|
+
case 2: {
|
|
257
|
+
const [array, newValue] = args;
|
|
258
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
259
|
+
return array.toSpliced(array.length, 0, newValue) as unknown as readonly [
|
|
260
|
+
...Ar,
|
|
261
|
+
V,
|
|
262
|
+
];
|
|
263
|
+
}
|
|
264
|
+
case 1: {
|
|
265
|
+
const [newValue] = args;
|
|
266
|
+
return (array) => toPushed(array, newValue);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Returns a new array with a value prepended to the beginning.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
*
|
|
276
|
+
* ```ts
|
|
277
|
+
* const base = [2, 3] as const;
|
|
278
|
+
*
|
|
279
|
+
* const prefixed = Arr.toUnshifted(base, 1);
|
|
280
|
+
* const prefixedCurried = Arr.toUnshifted(0)(base);
|
|
281
|
+
*
|
|
282
|
+
* assert.deepStrictEqual(prefixed, [1, 2, 3]);
|
|
283
|
+
* assert.deepStrictEqual(prefixedCurried, [0, 2, 3]);
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
export function toUnshifted<const Ar extends readonly unknown[], const V>(
|
|
287
|
+
array: Ar,
|
|
288
|
+
newValue: V,
|
|
289
|
+
): readonly [V, ...Ar];
|
|
290
|
+
|
|
291
|
+
export function toUnshifted<const V>(
|
|
292
|
+
newValue: V,
|
|
293
|
+
): <const Ar extends readonly unknown[]>(array: Ar) => readonly [V, ...Ar];
|
|
294
|
+
|
|
295
|
+
export function toUnshifted<Ar extends readonly unknown[], const V>(
|
|
296
|
+
...args: readonly [array: Ar, newValue: V] | readonly [newValue: V]
|
|
297
|
+
): readonly [V, ...Ar] | ((array: Ar) => readonly [V, ...Ar]) {
|
|
298
|
+
switch (args.length) {
|
|
299
|
+
case 2: {
|
|
300
|
+
const [array, newValue] = args;
|
|
301
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
302
|
+
return array.toSpliced(0, 0, newValue) as unknown as readonly [V, ...Ar];
|
|
303
|
+
}
|
|
304
|
+
case 1: {
|
|
305
|
+
const [newValue] = args;
|
|
306
|
+
return (array) => toUnshifted(array, newValue);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Returns a new array with all elements replaced by the specified value.
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
*
|
|
316
|
+
* ```ts
|
|
317
|
+
* const base = [1, 2, 3];
|
|
318
|
+
*
|
|
319
|
+
* const filled = Arr.toFilled(base, 0);
|
|
320
|
+
* const filledCurried = Arr.toFilled('x')(base);
|
|
321
|
+
*
|
|
322
|
+
* assert.deepStrictEqual(filled, [0, 0, 0]);
|
|
323
|
+
* assert.deepStrictEqual(filledCurried, ['x', 'x', 'x']);
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
export function toFilled<const Ar extends readonly unknown[], const V>(
|
|
327
|
+
array: Ar,
|
|
328
|
+
value: V,
|
|
329
|
+
): IsFixedLengthList<Ar> extends true
|
|
330
|
+
? ArrayOfLength<Ar['length'], V>
|
|
331
|
+
: Ar extends NonEmptyArray<unknown>
|
|
332
|
+
? NonEmptyArray<V>
|
|
333
|
+
: readonly V[];
|
|
334
|
+
|
|
335
|
+
// curried version
|
|
336
|
+
export function toFilled<const V>(
|
|
337
|
+
value: V,
|
|
338
|
+
): <const Ar extends readonly unknown[]>(
|
|
339
|
+
array: Ar,
|
|
340
|
+
) => IsFixedLengthList<Ar> extends true
|
|
341
|
+
? ArrayOfLength<Ar['length'], V>
|
|
342
|
+
: Ar extends NonEmptyArray<unknown>
|
|
343
|
+
? NonEmptyArray<V>
|
|
344
|
+
: readonly V[];
|
|
345
|
+
|
|
346
|
+
export function toFilled<E>(
|
|
347
|
+
...args: readonly [array: readonly E[], value: E] | readonly [value: E]
|
|
348
|
+
): readonly E[] | ((array: readonly E[]) => readonly E[]) {
|
|
349
|
+
switch (args.length) {
|
|
350
|
+
case 2: {
|
|
351
|
+
const [array, value] = args;
|
|
352
|
+
return create(asPositiveUint32(array.length), value);
|
|
353
|
+
}
|
|
354
|
+
case 1: {
|
|
355
|
+
const [value] = args;
|
|
356
|
+
return (array) => toFilled(array, value);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Returns a new array with elements in the specified range replaced by the specified value.
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
*
|
|
366
|
+
* ```ts
|
|
367
|
+
* const base = [0, 1, 2, 3, 4];
|
|
368
|
+
*
|
|
369
|
+
* const filledMiddle = Arr.toRangeFilled(base, 9, [1, 4]);
|
|
370
|
+
* const filledPrefix = Arr.toRangeFilled(8, [0, 2])(base);
|
|
371
|
+
*
|
|
372
|
+
* assert.deepStrictEqual(filledMiddle, [0, 9, 9, 9, 4]);
|
|
373
|
+
* assert.deepStrictEqual(filledPrefix, [8, 8, 2, 3, 4]);
|
|
374
|
+
* ```
|
|
375
|
+
*/
|
|
376
|
+
export function toRangeFilled<const Ar extends readonly unknown[], const V>(
|
|
377
|
+
array: Ar,
|
|
378
|
+
value: V,
|
|
379
|
+
fillRange: readonly [
|
|
380
|
+
start: ArgArrayIndexWithNegative<Ar>,
|
|
381
|
+
end: ArgArrayIndexWithNegative<Ar>,
|
|
382
|
+
],
|
|
383
|
+
): IsFixedLengthList<Ar> extends true
|
|
384
|
+
? ArrayOfLength<Ar['length'], V | Ar[number]>
|
|
385
|
+
: Ar extends NonEmptyArray<unknown>
|
|
386
|
+
? NonEmptyArray<V | Ar[number]>
|
|
387
|
+
: readonly (V | Ar[number])[];
|
|
388
|
+
|
|
389
|
+
// curried version
|
|
390
|
+
export function toRangeFilled<const V>(
|
|
391
|
+
value: V,
|
|
392
|
+
fillRange: readonly [
|
|
393
|
+
start: SizeType.ArgArrWithNegative,
|
|
394
|
+
end: SizeType.ArgArrWithNegative,
|
|
395
|
+
],
|
|
396
|
+
): <const Ar extends readonly unknown[]>(
|
|
397
|
+
array: Ar,
|
|
398
|
+
) => IsFixedLengthList<Ar> extends true
|
|
399
|
+
? ArrayOfLength<Ar['length'], V | Ar[number]>
|
|
400
|
+
: Ar extends NonEmptyArray<unknown>
|
|
401
|
+
? NonEmptyArray<V | Ar[number]>
|
|
402
|
+
: readonly (V | Ar[number])[];
|
|
403
|
+
|
|
404
|
+
export function toRangeFilled<E, const V>(
|
|
405
|
+
...args:
|
|
406
|
+
| readonly [
|
|
407
|
+
array: readonly E[],
|
|
408
|
+
value: V,
|
|
409
|
+
fillRange: readonly [
|
|
410
|
+
start: SizeType.ArgArrWithNegative,
|
|
411
|
+
end: SizeType.ArgArrWithNegative,
|
|
412
|
+
],
|
|
413
|
+
]
|
|
414
|
+
| readonly [
|
|
415
|
+
value: V,
|
|
416
|
+
fillRange: readonly [
|
|
417
|
+
start: SizeType.ArgArrWithNegative,
|
|
418
|
+
end: SizeType.ArgArrWithNegative,
|
|
419
|
+
],
|
|
420
|
+
]
|
|
421
|
+
): readonly (E | V)[] | ((array: readonly E[]) => readonly (E | V)[]) {
|
|
422
|
+
switch (args.length) {
|
|
423
|
+
case 3: {
|
|
424
|
+
const [array, value, [start, end]] = args;
|
|
425
|
+
const mut_cp: (E | V)[] = castMutable(copy(array));
|
|
426
|
+
mut_cp.fill(value, start, end);
|
|
427
|
+
return mut_cp;
|
|
428
|
+
}
|
|
429
|
+
case 2: {
|
|
430
|
+
const [value, fillRange] = args;
|
|
431
|
+
return (array) => toRangeFilled(array, value, fillRange);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
package/src/array/{array-utils-modification.test.mts → impl/array-utils-modification.test.mts}
RENAMED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import { expectType } from '
|
|
2
|
-
import { asUint32 } from '
|
|
3
|
-
import {
|
|
1
|
+
import { expectType } from '../../expect-type.mjs';
|
|
2
|
+
import { asUint32 } from '../../number/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
set,
|
|
5
|
+
toFilled,
|
|
6
|
+
toInserted,
|
|
7
|
+
toPushed,
|
|
8
|
+
toRangeFilled,
|
|
9
|
+
toRemoved,
|
|
10
|
+
toUnshifted,
|
|
11
|
+
toUpdated,
|
|
12
|
+
} from './array-utils-modification.mjs';
|
|
4
13
|
|
|
5
14
|
describe('Arr modifications', () => {
|
|
6
15
|
describe('toUpdated', () => {
|
|
7
16
|
const xs = [1, 2, 3] as const;
|
|
8
|
-
const result =
|
|
17
|
+
const result = toUpdated(xs, 1, (x) => x + 2);
|
|
9
18
|
|
|
10
19
|
expectType<typeof result, ArrayOfLength<3, number>>('=');
|
|
11
20
|
|
|
@@ -18,7 +27,7 @@ describe('Arr modifications', () => {
|
|
|
18
27
|
const xs = [1, 2, 3] as const;
|
|
19
28
|
|
|
20
29
|
test('case 1', () => {
|
|
21
|
-
const result =
|
|
30
|
+
const result = toInserted(xs, 1, 5);
|
|
22
31
|
|
|
23
32
|
expectType<typeof result, ArrayOfLength<4, 1 | 2 | 3 | 5>>('=');
|
|
24
33
|
|
|
@@ -26,7 +35,7 @@ describe('Arr modifications', () => {
|
|
|
26
35
|
});
|
|
27
36
|
|
|
28
37
|
test('case 2 (insert head)', () => {
|
|
29
|
-
const result =
|
|
38
|
+
const result = toInserted(xs, 0, 5);
|
|
30
39
|
|
|
31
40
|
expectType<typeof result, ArrayOfLength<4, 1 | 2 | 3 | 5>>('=');
|
|
32
41
|
|
|
@@ -34,7 +43,11 @@ describe('Arr modifications', () => {
|
|
|
34
43
|
});
|
|
35
44
|
|
|
36
45
|
test('case 3 (insert tail)', () => {
|
|
37
|
-
const result =
|
|
46
|
+
const result = toInserted(
|
|
47
|
+
['a', 'b', 'c'] as readonly string[],
|
|
48
|
+
asUint32(999),
|
|
49
|
+
5,
|
|
50
|
+
);
|
|
38
51
|
|
|
39
52
|
expectType<typeof result, NonEmptyArray<string | 5>>('=');
|
|
40
53
|
|
|
@@ -45,7 +58,7 @@ describe('Arr modifications', () => {
|
|
|
45
58
|
describe('toRemoved', () => {
|
|
46
59
|
test('case 1', () => {
|
|
47
60
|
const xs = [1, 2, 3] as const;
|
|
48
|
-
const result =
|
|
61
|
+
const result = toRemoved(xs, 1);
|
|
49
62
|
|
|
50
63
|
expectType<typeof result, readonly (1 | 2 | 3)[]>('=');
|
|
51
64
|
|
|
@@ -54,7 +67,7 @@ describe('Arr modifications', () => {
|
|
|
54
67
|
|
|
55
68
|
test('case 2 (remove head)', () => {
|
|
56
69
|
const xs = [1, 2, 3] as const;
|
|
57
|
-
const result =
|
|
70
|
+
const result = toRemoved(xs, 0);
|
|
58
71
|
|
|
59
72
|
expectType<typeof result, readonly (1 | 2 | 3)[]>('=');
|
|
60
73
|
|
|
@@ -63,7 +76,7 @@ describe('Arr modifications', () => {
|
|
|
63
76
|
|
|
64
77
|
test('case 3 (remove tail)', () => {
|
|
65
78
|
const xs = [1, 2, 3] as const;
|
|
66
|
-
const result =
|
|
79
|
+
const result = toRemoved(xs, 2);
|
|
67
80
|
|
|
68
81
|
expectType<typeof result, readonly (1 | 2 | 3)[]>('=');
|
|
69
82
|
|
|
@@ -72,7 +85,7 @@ describe('Arr modifications', () => {
|
|
|
72
85
|
|
|
73
86
|
test('case 4 (number[])', () => {
|
|
74
87
|
const xs: number[] = [1, 2, 3];
|
|
75
|
-
const result =
|
|
88
|
+
const result = toRemoved(xs, 5);
|
|
76
89
|
|
|
77
90
|
expectType<typeof result, readonly number[]>('=');
|
|
78
91
|
|
|
@@ -83,7 +96,7 @@ describe('Arr modifications', () => {
|
|
|
83
96
|
describe('toPushed', () => {
|
|
84
97
|
test('case 1', () => {
|
|
85
98
|
const xs = [1, 2, 3] as const;
|
|
86
|
-
const result =
|
|
99
|
+
const result = toPushed(xs, 4 as const);
|
|
87
100
|
|
|
88
101
|
expectType<typeof result, readonly [1, 2, 3, 4]>('=');
|
|
89
102
|
|
|
@@ -92,7 +105,7 @@ describe('Arr modifications', () => {
|
|
|
92
105
|
|
|
93
106
|
test('case 2', () => {
|
|
94
107
|
const xs: number[] = [1, 2, 3];
|
|
95
|
-
const result =
|
|
108
|
+
const result = toPushed(xs, 4 as const);
|
|
96
109
|
|
|
97
110
|
expectType<typeof result, readonly [...number[], 4]>('=');
|
|
98
111
|
|
|
@@ -104,7 +117,7 @@ describe('Arr modifications', () => {
|
|
|
104
117
|
test('case 1', () => {
|
|
105
118
|
const xs = [1, 2, 3] as const;
|
|
106
119
|
|
|
107
|
-
const result =
|
|
120
|
+
const result = toUnshifted(xs, 4 as const);
|
|
108
121
|
|
|
109
122
|
expectType<typeof result, readonly [4, 1, 2, 3]>('=');
|
|
110
123
|
|
|
@@ -114,7 +127,7 @@ describe('Arr modifications', () => {
|
|
|
114
127
|
test('case 2', () => {
|
|
115
128
|
const xs: number[] = [1, 2, 3];
|
|
116
129
|
|
|
117
|
-
const result =
|
|
130
|
+
const result = toUnshifted(xs, 4 as const);
|
|
118
131
|
|
|
119
132
|
expectType<typeof result, readonly [4, ...number[]]>('=');
|
|
120
133
|
|
|
@@ -125,13 +138,13 @@ describe('Arr modifications', () => {
|
|
|
125
138
|
describe('toFilled', () => {
|
|
126
139
|
test('should fill entire array with value', () => {
|
|
127
140
|
const arr = [1, 2, 3, 4, 5];
|
|
128
|
-
const result =
|
|
141
|
+
const result = toFilled(arr, 0);
|
|
129
142
|
|
|
130
143
|
expect(result).toStrictEqual([0, 0, 0, 0, 0]);
|
|
131
144
|
});
|
|
132
145
|
|
|
133
146
|
test('should work with curried version', () => {
|
|
134
|
-
const fillWithZero =
|
|
147
|
+
const fillWithZero = toFilled(0);
|
|
135
148
|
const arr = [1, 2, 3];
|
|
136
149
|
const result = fillWithZero(arr);
|
|
137
150
|
|
|
@@ -142,35 +155,35 @@ describe('Arr modifications', () => {
|
|
|
142
155
|
describe('toRangeFilled', () => {
|
|
143
156
|
test('should fill array with range', () => {
|
|
144
157
|
const arr = [1, 2, 3, 4, 5];
|
|
145
|
-
const result =
|
|
158
|
+
const result = toRangeFilled(arr, 0, [1, 4]);
|
|
146
159
|
|
|
147
160
|
expect(result).toStrictEqual([1, 0, 0, 0, 5]);
|
|
148
161
|
});
|
|
149
162
|
|
|
150
163
|
test('should fill with range starting from 0', () => {
|
|
151
164
|
const arr = [1, 2, 3, 4, 5];
|
|
152
|
-
const result =
|
|
165
|
+
const result = toRangeFilled(arr, 9, [0, 3]);
|
|
153
166
|
|
|
154
167
|
expect(result).toStrictEqual([9, 9, 9, 4, 5]);
|
|
155
168
|
});
|
|
156
169
|
|
|
157
170
|
test('should handle empty range', () => {
|
|
158
171
|
const arr = [1, 2, 3];
|
|
159
|
-
const result =
|
|
172
|
+
const result = toRangeFilled(arr, 0, [2, 2]);
|
|
160
173
|
|
|
161
174
|
expect(result).toStrictEqual([1, 2, 3]);
|
|
162
175
|
});
|
|
163
176
|
|
|
164
177
|
test('should clamp range to array bounds', () => {
|
|
165
178
|
const arr = [1, 2, 3];
|
|
166
|
-
const result =
|
|
179
|
+
const result = toRangeFilled(arr, 0, [1, 10]);
|
|
167
180
|
|
|
168
181
|
expect(result).toStrictEqual([1, 0, 0]);
|
|
169
182
|
});
|
|
170
183
|
|
|
171
184
|
test('should handle negative start (clamped to 0)', () => {
|
|
172
185
|
const arr = [1, 2, 3];
|
|
173
|
-
const result =
|
|
186
|
+
const result = toRangeFilled(arr, 9, [-5, 2]);
|
|
174
187
|
|
|
175
188
|
expect(result).toStrictEqual([9, 9, 3]);
|
|
176
189
|
});
|
|
@@ -179,19 +192,19 @@ describe('Arr modifications', () => {
|
|
|
179
192
|
const arr = [1, 2, 3];
|
|
180
193
|
|
|
181
194
|
// @ts-expect-error start must be an integer
|
|
182
|
-
expect(
|
|
195
|
+
expect(toRangeFilled(arr, 0, [1.5, 3])).toStrictEqual([1, 0, 0]);
|
|
183
196
|
});
|
|
184
197
|
|
|
185
198
|
test('A non-integer ending value should result in a type error', () => {
|
|
186
199
|
const arr = [1, 2, 3];
|
|
187
200
|
|
|
188
201
|
// @ts-expect-error end must be an integer
|
|
189
|
-
expect(
|
|
202
|
+
expect(toRangeFilled(arr, 0, [1, 2.5])).toStrictEqual([1, 0, 3]);
|
|
190
203
|
});
|
|
191
204
|
});
|
|
192
205
|
|
|
193
206
|
describe('set', () => {
|
|
194
|
-
const result =
|
|
207
|
+
const result = set([1, 2, 3], 1, 4);
|
|
195
208
|
|
|
196
209
|
expectType<typeof result, readonly [1 | 4, 2 | 4, 3 | 4]>('=');
|
|
197
210
|
|
|
@@ -201,7 +214,7 @@ describe('Arr modifications', () => {
|
|
|
201
214
|
|
|
202
215
|
test('should work with different value types', () => {
|
|
203
216
|
const nums = [1, 2, 3] as const;
|
|
204
|
-
const withString =
|
|
217
|
+
const withString = set(nums, 1, 'two');
|
|
205
218
|
expectType<typeof withString, readonly [1 | 'two', 2 | 'two', 3 | 'two']>(
|
|
206
219
|
'=',
|
|
207
220
|
);
|
|
@@ -210,13 +223,13 @@ describe('Arr modifications', () => {
|
|
|
210
223
|
|
|
211
224
|
test('should work at index 0', () => {
|
|
212
225
|
const tuple = ['a', 'b', 'c'] as const;
|
|
213
|
-
const updated =
|
|
226
|
+
const updated = set(tuple, 0, 'A');
|
|
214
227
|
expect(updated).toStrictEqual(['A', 'b', 'c']);
|
|
215
228
|
});
|
|
216
229
|
|
|
217
230
|
test('should work at last index', () => {
|
|
218
231
|
const tuple = ['a', 'b', 'c'] as const;
|
|
219
|
-
const updated =
|
|
232
|
+
const updated = set(tuple, 2, 'C');
|
|
220
233
|
expect(updated).toStrictEqual(['a', 'b', 'C']);
|
|
221
234
|
});
|
|
222
235
|
});
|