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
|
@@ -1,102 +1,111 @@
|
|
|
1
|
-
import { expectType } from '
|
|
2
|
-
import { range } from '
|
|
3
|
-
import { asNonZeroSafeInt, asUint32 } from '
|
|
4
|
-
import {
|
|
1
|
+
import { expectType } from '../../expect-type.mjs';
|
|
2
|
+
import { range as rangeIterator } from '../../iterator/index.mjs';
|
|
3
|
+
import { asNonZeroSafeInt, asUint32 } from '../../number/index.mjs';
|
|
4
|
+
import {
|
|
5
|
+
copy,
|
|
6
|
+
create,
|
|
7
|
+
generate,
|
|
8
|
+
generateAsync,
|
|
9
|
+
newArray,
|
|
10
|
+
range,
|
|
11
|
+
seq,
|
|
12
|
+
zeros,
|
|
13
|
+
} from './array-utils-creation.mjs';
|
|
5
14
|
|
|
6
15
|
describe('Arr creations', () => {
|
|
7
16
|
describe('zeros', () => {
|
|
8
17
|
test('fixed length', () => {
|
|
9
|
-
const result =
|
|
18
|
+
const result = zeros(3);
|
|
10
19
|
expectType<typeof result, readonly [0, 0, 0]>('=');
|
|
11
20
|
expect(result).toStrictEqual([0, 0, 0]);
|
|
12
21
|
});
|
|
13
22
|
|
|
14
23
|
test('fixed length (empty)', () => {
|
|
15
|
-
const result =
|
|
24
|
+
const result = zeros(0);
|
|
16
25
|
expectType<typeof result, readonly []>('=');
|
|
17
26
|
expect(result).toStrictEqual([]);
|
|
18
27
|
});
|
|
19
28
|
|
|
20
29
|
test('unknown length', () => {
|
|
21
30
|
const n: number = 3;
|
|
22
|
-
const result =
|
|
31
|
+
const result = zeros(asUint32(n));
|
|
23
32
|
expectType<typeof result, readonly 0[]>('=');
|
|
24
33
|
expect(result).toStrictEqual([0, 0, 0]);
|
|
25
34
|
});
|
|
26
35
|
|
|
27
36
|
test('should create array with zero length', () => {
|
|
28
|
-
const result =
|
|
37
|
+
const result = zeros(0);
|
|
29
38
|
expect(result).toStrictEqual([]);
|
|
30
39
|
expect(result).toHaveLength(0);
|
|
31
40
|
});
|
|
32
41
|
|
|
33
42
|
test('should create large arrays', () => {
|
|
34
|
-
const result =
|
|
43
|
+
const result = zeros(asUint32(1000));
|
|
35
44
|
expect(result).toHaveLength(1000);
|
|
36
45
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
37
46
|
expect(result.every((x) => x === 0)).toBe(true);
|
|
38
47
|
});
|
|
39
48
|
|
|
40
49
|
test('should work with curried version', () => {
|
|
41
|
-
const createTenZeros =
|
|
50
|
+
const createTenZeros = zeros(10);
|
|
42
51
|
expect(createTenZeros).toStrictEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
|
43
52
|
});
|
|
44
53
|
});
|
|
45
54
|
|
|
46
55
|
describe('seq', () => {
|
|
47
56
|
test('fixed length', () => {
|
|
48
|
-
const result =
|
|
57
|
+
const result = seq(5);
|
|
49
58
|
expectType<typeof result, readonly [0, 1, 2, 3, 4]>('=');
|
|
50
59
|
expect(result).toStrictEqual([0, 1, 2, 3, 4]);
|
|
51
60
|
});
|
|
52
61
|
|
|
53
62
|
test('fixed length (empty)', () => {
|
|
54
|
-
const result =
|
|
63
|
+
const result = seq(0);
|
|
55
64
|
expectType<typeof result, readonly []>('=');
|
|
56
65
|
expect(result).toStrictEqual([]);
|
|
57
66
|
});
|
|
58
67
|
|
|
59
68
|
test('unknown length', () => {
|
|
60
69
|
const n: number = 3;
|
|
61
|
-
const result =
|
|
70
|
+
const result = seq(asUint32(n));
|
|
62
71
|
expectType<typeof result, readonly SizeType.Arr[]>('=');
|
|
63
72
|
expect(result).toStrictEqual([0, 1, 2]);
|
|
64
73
|
});
|
|
65
74
|
|
|
66
75
|
test('should create sequence with zero length', () => {
|
|
67
|
-
const result =
|
|
76
|
+
const result = seq(0);
|
|
68
77
|
expect(result).toStrictEqual([]);
|
|
69
78
|
});
|
|
70
79
|
|
|
71
80
|
test('should create sequence with large length', () => {
|
|
72
|
-
const result =
|
|
81
|
+
const result = seq(asUint32(100));
|
|
73
82
|
expect(result).toHaveLength(100);
|
|
74
83
|
expect(result[0]).toBe(0);
|
|
75
84
|
expect(result[99]).toBe(99);
|
|
76
85
|
});
|
|
77
86
|
|
|
78
87
|
test('should work with curried version', () => {
|
|
79
|
-
const createFiveSeq =
|
|
88
|
+
const createFiveSeq = seq(5);
|
|
80
89
|
expect(createFiveSeq).toStrictEqual([0, 1, 2, 3, 4]);
|
|
81
90
|
});
|
|
82
91
|
});
|
|
83
92
|
|
|
84
93
|
describe('create', () => {
|
|
85
94
|
test('fixed length with primitive value', () => {
|
|
86
|
-
const result =
|
|
95
|
+
const result = create(3, 'a');
|
|
87
96
|
expectType<typeof result, readonly ['a', 'a', 'a']>('=');
|
|
88
97
|
expect(result).toStrictEqual(['a', 'a', 'a']);
|
|
89
98
|
});
|
|
90
99
|
|
|
91
100
|
test('fixed length with null', () => {
|
|
92
|
-
const result =
|
|
101
|
+
const result = create(2, null);
|
|
93
102
|
expectType<typeof result, readonly [null, null]>('=');
|
|
94
103
|
expect(result).toStrictEqual([null, null]);
|
|
95
104
|
});
|
|
96
105
|
|
|
97
106
|
test('fixed length with object (shallow copy)', () => {
|
|
98
107
|
const obj = { id: 1 };
|
|
99
|
-
const result =
|
|
108
|
+
const result = create(2, obj);
|
|
100
109
|
expectType<typeof result, readonly [{ id: number }, { id: number }]>(
|
|
101
110
|
'~=',
|
|
102
111
|
);
|
|
@@ -106,40 +115,40 @@ describe('Arr creations', () => {
|
|
|
106
115
|
});
|
|
107
116
|
|
|
108
117
|
test('fixed length (empty)', () => {
|
|
109
|
-
const result =
|
|
118
|
+
const result = create(0, 123);
|
|
110
119
|
expectType<typeof result, readonly []>('=');
|
|
111
120
|
expect(result).toStrictEqual([]);
|
|
112
121
|
});
|
|
113
122
|
|
|
114
123
|
test('unknown length', () => {
|
|
115
124
|
const n: number = 2;
|
|
116
|
-
const result =
|
|
125
|
+
const result = create(asUint32(n), true);
|
|
117
126
|
expectType<typeof result, readonly true[]>('=');
|
|
118
127
|
expect(result).toStrictEqual([true, true]);
|
|
119
128
|
});
|
|
120
129
|
|
|
121
130
|
test('should create array with function values', () => {
|
|
122
131
|
const fn = (): string => 'test';
|
|
123
|
-
const result =
|
|
132
|
+
const result = create(3, fn);
|
|
124
133
|
expect(result).toStrictEqual([fn, fn, fn]);
|
|
125
134
|
expect(result[0]).toBe(fn);
|
|
126
135
|
});
|
|
127
136
|
|
|
128
137
|
test('should create array with object values', () => {
|
|
129
138
|
const obj = { a: 1 };
|
|
130
|
-
const result =
|
|
139
|
+
const result = create(2, obj);
|
|
131
140
|
expect(result).toStrictEqual([obj, obj]);
|
|
132
141
|
expect(result[0]).toBe(obj); // Same reference
|
|
133
142
|
});
|
|
134
143
|
|
|
135
144
|
test('should create empty array when length is 0', () => {
|
|
136
|
-
const result =
|
|
145
|
+
const result = create(0, 'value');
|
|
137
146
|
expect(result).toStrictEqual([]);
|
|
138
147
|
});
|
|
139
148
|
|
|
140
149
|
test('newArray is alias for create', () => {
|
|
141
|
-
const created1 =
|
|
142
|
-
const created2 =
|
|
150
|
+
const created1 = create(3, 'test');
|
|
151
|
+
const created2 = newArray(3, 'test');
|
|
143
152
|
expect(created1).toStrictEqual(created2);
|
|
144
153
|
expect(created1).toStrictEqual(['test', 'test', 'test']);
|
|
145
154
|
});
|
|
@@ -148,7 +157,7 @@ describe('Arr creations', () => {
|
|
|
148
157
|
describe('copy', () => {
|
|
149
158
|
test('should create a shallow copy of an array of primitives', () => {
|
|
150
159
|
const original = [1, 2, 3] as const;
|
|
151
|
-
const copied =
|
|
160
|
+
const copied = copy(original);
|
|
152
161
|
expectType<typeof copied, readonly [1, 2, 3]>('=');
|
|
153
162
|
expect(copied).toStrictEqual(original);
|
|
154
163
|
expect(copied).not.toBe(original);
|
|
@@ -158,7 +167,7 @@ describe('Arr creations', () => {
|
|
|
158
167
|
const obj1 = { id: 1 };
|
|
159
168
|
const obj2 = { id: 2 };
|
|
160
169
|
const original = [obj1, obj2] as const;
|
|
161
|
-
const copied =
|
|
170
|
+
const copied = copy(original);
|
|
162
171
|
|
|
163
172
|
expectType<typeof copied, readonly [{ id: number }, { id: number }]>('=');
|
|
164
173
|
expect(copied).toStrictEqual(original);
|
|
@@ -169,7 +178,7 @@ describe('Arr creations', () => {
|
|
|
169
178
|
|
|
170
179
|
test('should create a copy of an empty array', () => {
|
|
171
180
|
const original = [] as const;
|
|
172
|
-
const copied =
|
|
181
|
+
const copied = copy(original);
|
|
173
182
|
expectType<typeof copied, readonly []>('=');
|
|
174
183
|
expect(copied).toStrictEqual(original);
|
|
175
184
|
expect(copied).not.toBe(original);
|
|
@@ -177,7 +186,7 @@ describe('Arr creations', () => {
|
|
|
177
186
|
|
|
178
187
|
test('should create a copy of an array with mixed types', () => {
|
|
179
188
|
const original = [1, 'hello', true, null, undefined] as const;
|
|
180
|
-
const copied =
|
|
189
|
+
const copied = copy(original);
|
|
181
190
|
expectType<typeof copied, readonly [1, 'hello', true, null, undefined]>(
|
|
182
191
|
'=',
|
|
183
192
|
);
|
|
@@ -187,7 +196,7 @@ describe('Arr creations', () => {
|
|
|
187
196
|
|
|
188
197
|
test('should handle unknown array type', () => {
|
|
189
198
|
const mut_original: number[] = [1, 2, 3];
|
|
190
|
-
const copied =
|
|
199
|
+
const copied = copy(mut_original);
|
|
191
200
|
expectType<typeof copied, number[]>('=');
|
|
192
201
|
expect(copied).toStrictEqual(mut_original);
|
|
193
202
|
expect(copied).not.toBe(mut_original);
|
|
@@ -199,7 +208,7 @@ describe('Arr creations', () => {
|
|
|
199
208
|
|
|
200
209
|
test('should create shallow copy of array', () => {
|
|
201
210
|
const original = [1, 2, 3] as const;
|
|
202
|
-
const copied =
|
|
211
|
+
const copied = copy(original);
|
|
203
212
|
expectType<typeof copied, readonly [1, 2, 3]>('=');
|
|
204
213
|
expect(copied).toStrictEqual(original);
|
|
205
214
|
expect(copied).not.toBe(original);
|
|
@@ -207,14 +216,14 @@ describe('Arr creations', () => {
|
|
|
207
216
|
|
|
208
217
|
test('should work with empty array', () => {
|
|
209
218
|
const empty = [] as const;
|
|
210
|
-
const copied =
|
|
219
|
+
const copied = copy(empty);
|
|
211
220
|
expect(copied).toStrictEqual([]);
|
|
212
221
|
expect(copied).not.toBe(empty);
|
|
213
222
|
});
|
|
214
223
|
|
|
215
224
|
test('should preserve array type', () => {
|
|
216
225
|
const mixed = [1, 'hello', true] as const;
|
|
217
|
-
const copied =
|
|
226
|
+
const copied = copy(mixed);
|
|
218
227
|
expectType<typeof copied, readonly [1, 'hello', true]>('=');
|
|
219
228
|
expect(copied).toStrictEqual([1, 'hello', true]);
|
|
220
229
|
});
|
|
@@ -222,51 +231,51 @@ describe('Arr creations', () => {
|
|
|
222
231
|
|
|
223
232
|
describe('range', () => {
|
|
224
233
|
test('start < end, step = 1 (default)', () => {
|
|
225
|
-
const result =
|
|
234
|
+
const result = range(1, 5);
|
|
226
235
|
expectType<typeof result, readonly [1, 2, 3, 4]>('=');
|
|
227
236
|
expect(result).toStrictEqual([1, 2, 3, 4]);
|
|
228
237
|
});
|
|
229
238
|
|
|
230
239
|
test('start === end, step = 1 (default)', () => {
|
|
231
|
-
const result =
|
|
240
|
+
const result = range(3, 3);
|
|
232
241
|
expectType<typeof result, readonly []>('=');
|
|
233
242
|
expect(result).toStrictEqual([]);
|
|
234
243
|
});
|
|
235
244
|
|
|
236
245
|
test('start > end, step = 1 (default)', () => {
|
|
237
|
-
const result =
|
|
246
|
+
const result = range(5, 1);
|
|
238
247
|
expectType<typeof result, readonly []>('=');
|
|
239
248
|
expect(result).toStrictEqual([]);
|
|
240
249
|
});
|
|
241
250
|
|
|
242
251
|
test('start < end, step > 1', () => {
|
|
243
|
-
const result =
|
|
252
|
+
const result = range(0, 6, 2);
|
|
244
253
|
expectType<typeof result, readonly SafeUint[]>('='); // Type is less specific with explicit step
|
|
245
254
|
expect(result).toStrictEqual([0, 2, 4]);
|
|
246
255
|
});
|
|
247
256
|
|
|
248
257
|
test('start < end, step > 1, not reaching end', () => {
|
|
249
|
-
const result =
|
|
258
|
+
const result = range(0, 5, 2);
|
|
250
259
|
expect(result).toStrictEqual([0, 2, 4]);
|
|
251
260
|
});
|
|
252
261
|
|
|
253
262
|
test('start > end, step < 0', () => {
|
|
254
|
-
const result =
|
|
263
|
+
const result = range(5, 0, -1);
|
|
255
264
|
expect(result).toStrictEqual([5, 4, 3, 2, 1]);
|
|
256
265
|
});
|
|
257
266
|
|
|
258
267
|
test('start > end, step < 0, not reaching end', () => {
|
|
259
|
-
const result =
|
|
268
|
+
const result = range(5, 1, -2);
|
|
260
269
|
expect(result).toStrictEqual([5, 3]);
|
|
261
270
|
});
|
|
262
271
|
|
|
263
272
|
test('start < end, step < 0 (empty result)', () => {
|
|
264
|
-
const result =
|
|
273
|
+
const result = range(1, 5, -1);
|
|
265
274
|
expect(result).toStrictEqual([]);
|
|
266
275
|
});
|
|
267
276
|
|
|
268
277
|
test('start > end, step > 0 (empty result)', () => {
|
|
269
|
-
const result =
|
|
278
|
+
const result = range(5, 1, 1);
|
|
270
279
|
expect(result).toStrictEqual([]);
|
|
271
280
|
});
|
|
272
281
|
|
|
@@ -274,7 +283,7 @@ describe('Arr creations', () => {
|
|
|
274
283
|
const start: number = 1;
|
|
275
284
|
const end: number = 4;
|
|
276
285
|
const step: number = 1;
|
|
277
|
-
const result =
|
|
286
|
+
const result = range(
|
|
278
287
|
asUint32(start),
|
|
279
288
|
asUint32(end),
|
|
280
289
|
asNonZeroSafeInt(step),
|
|
@@ -284,7 +293,7 @@ describe('Arr creations', () => {
|
|
|
284
293
|
});
|
|
285
294
|
|
|
286
295
|
test('range(1, 3)', () => {
|
|
287
|
-
const result =
|
|
296
|
+
const result = range(1, 3);
|
|
288
297
|
|
|
289
298
|
expectType<typeof result, readonly [1, 2]>('=');
|
|
290
299
|
|
|
@@ -292,7 +301,7 @@ describe('Arr creations', () => {
|
|
|
292
301
|
});
|
|
293
302
|
|
|
294
303
|
test('range(1, 3, 1)', () => {
|
|
295
|
-
const result =
|
|
304
|
+
const result = range(1, 3, 1);
|
|
296
305
|
|
|
297
306
|
expectType<typeof result, readonly [1, 2]>('=');
|
|
298
307
|
|
|
@@ -300,7 +309,7 @@ describe('Arr creations', () => {
|
|
|
300
309
|
});
|
|
301
310
|
|
|
302
311
|
test('range(0, 0)', () => {
|
|
303
|
-
const result =
|
|
312
|
+
const result = range(0, 0);
|
|
304
313
|
|
|
305
314
|
expectType<typeof result, readonly []>('=');
|
|
306
315
|
|
|
@@ -308,7 +317,7 @@ describe('Arr creations', () => {
|
|
|
308
317
|
});
|
|
309
318
|
|
|
310
319
|
test('range(0, 1)', () => {
|
|
311
|
-
const result =
|
|
320
|
+
const result = range(0, 1);
|
|
312
321
|
|
|
313
322
|
expectType<typeof result, readonly [0]>('=');
|
|
314
323
|
|
|
@@ -316,7 +325,7 @@ describe('Arr creations', () => {
|
|
|
316
325
|
});
|
|
317
326
|
|
|
318
327
|
test('range(0, -1)', () => {
|
|
319
|
-
const result =
|
|
328
|
+
const result = range(0, -1);
|
|
320
329
|
|
|
321
330
|
expectType<typeof result, readonly SafeInt[]>('=');
|
|
322
331
|
|
|
@@ -324,7 +333,7 @@ describe('Arr creations', () => {
|
|
|
324
333
|
});
|
|
325
334
|
|
|
326
335
|
test('range(SmallUint, SmallUint)', () => {
|
|
327
|
-
const result =
|
|
336
|
+
const result = range<SmallUint, SmallUint>(0, 1);
|
|
328
337
|
|
|
329
338
|
expectType<
|
|
330
339
|
typeof result,
|
|
@@ -375,7 +384,7 @@ describe('Arr creations', () => {
|
|
|
375
384
|
});
|
|
376
385
|
|
|
377
386
|
test('range(0 | 1 | 2, 1 | 2 | 3)', () => {
|
|
378
|
-
const result =
|
|
387
|
+
const result = range<0 | 1 | 2, 1 | 2 | 3>(0, 1);
|
|
379
388
|
|
|
380
389
|
expectType<typeof result, readonly (0 | 1 | 2)[]>('=');
|
|
381
390
|
|
|
@@ -383,7 +392,7 @@ describe('Arr creations', () => {
|
|
|
383
392
|
});
|
|
384
393
|
|
|
385
394
|
test('range(2|3, 5|6|7)', () => {
|
|
386
|
-
const result =
|
|
395
|
+
const result = range<2 | 3, 5 | 6 | 7>(2, 5);
|
|
387
396
|
|
|
388
397
|
expectType<typeof result, readonly (2 | 3 | 4 | 5 | 6)[]>('=');
|
|
389
398
|
|
|
@@ -391,7 +400,7 @@ describe('Arr creations', () => {
|
|
|
391
400
|
});
|
|
392
401
|
|
|
393
402
|
test('range(0, 10, 2)', () => {
|
|
394
|
-
const result =
|
|
403
|
+
const result = range(0, 10, 2);
|
|
395
404
|
|
|
396
405
|
expectType<typeof result, readonly SafeUint[]>('=');
|
|
397
406
|
|
|
@@ -399,7 +408,7 @@ describe('Arr creations', () => {
|
|
|
399
408
|
});
|
|
400
409
|
|
|
401
410
|
test('range(0, 11, 2)', () => {
|
|
402
|
-
const result =
|
|
411
|
+
const result = range(0, 11, 2);
|
|
403
412
|
|
|
404
413
|
expectType<typeof result, readonly SafeUint[]>('=');
|
|
405
414
|
|
|
@@ -407,7 +416,7 @@ describe('Arr creations', () => {
|
|
|
407
416
|
});
|
|
408
417
|
|
|
409
418
|
test('range(1, 12, 2)', () => {
|
|
410
|
-
const result =
|
|
419
|
+
const result = range(1, 12, 2);
|
|
411
420
|
|
|
412
421
|
expectType<typeof result, readonly SafeUint[]>('=');
|
|
413
422
|
|
|
@@ -418,25 +427,25 @@ describe('Arr creations', () => {
|
|
|
418
427
|
// and doesn't validate inputs in this way
|
|
419
428
|
|
|
420
429
|
test('should handle range with step larger than difference', () => {
|
|
421
|
-
const result =
|
|
430
|
+
const result = range(0, 5, 10);
|
|
422
431
|
expect(result).toStrictEqual([0]);
|
|
423
432
|
});
|
|
424
433
|
|
|
425
434
|
test('should handle negative step with increasing range', () => {
|
|
426
|
-
const result =
|
|
435
|
+
const result = range(0, 5, -1);
|
|
427
436
|
expect(result).toStrictEqual([]); // Should be empty when step direction conflicts
|
|
428
437
|
});
|
|
429
438
|
|
|
430
439
|
test('should work with basic range functionality', () => {
|
|
431
440
|
// Test basic range functionality without currying assumptions
|
|
432
|
-
const result =
|
|
441
|
+
const result = range(0, 5, 1);
|
|
433
442
|
expect(result).toStrictEqual([0, 1, 2, 3, 4]);
|
|
434
443
|
});
|
|
435
444
|
});
|
|
436
445
|
|
|
437
446
|
describe('generate', () => {
|
|
438
447
|
test('basic generator usage', () => {
|
|
439
|
-
const result =
|
|
448
|
+
const result = generate<number>(function* () {
|
|
440
449
|
yield 1;
|
|
441
450
|
yield 2;
|
|
442
451
|
yield 3;
|
|
@@ -447,7 +456,7 @@ describe('Arr creations', () => {
|
|
|
447
456
|
});
|
|
448
457
|
|
|
449
458
|
test('generator with yield*', () => {
|
|
450
|
-
const result =
|
|
459
|
+
const result = generate<number>(function* () {
|
|
451
460
|
yield 1;
|
|
452
461
|
yield* [2, 3];
|
|
453
462
|
yield 4;
|
|
@@ -458,7 +467,7 @@ describe('Arr creations', () => {
|
|
|
458
467
|
});
|
|
459
468
|
|
|
460
469
|
test('empty generator', () => {
|
|
461
|
-
const result =
|
|
470
|
+
const result = generate<string>(function* () {
|
|
462
471
|
// No yields
|
|
463
472
|
});
|
|
464
473
|
|
|
@@ -468,7 +477,7 @@ describe('Arr creations', () => {
|
|
|
468
477
|
|
|
469
478
|
test('generator with conditional logic', () => {
|
|
470
479
|
const condition = true as boolean; // Simulating a condition
|
|
471
|
-
const result =
|
|
480
|
+
const result = generate<number>(function* () {
|
|
472
481
|
yield 1;
|
|
473
482
|
if (condition) {
|
|
474
483
|
yield 2;
|
|
@@ -482,7 +491,7 @@ describe('Arr creations', () => {
|
|
|
482
491
|
|
|
483
492
|
test('generator with early return', () => {
|
|
484
493
|
const condition = true as boolean; // Simulating a condition
|
|
485
|
-
const result =
|
|
494
|
+
const result = generate<number>(function* () {
|
|
486
495
|
yield 1;
|
|
487
496
|
if (condition) {
|
|
488
497
|
return; // Early return is OK
|
|
@@ -495,7 +504,7 @@ describe('Arr creations', () => {
|
|
|
495
504
|
});
|
|
496
505
|
|
|
497
506
|
test('generator with complex data types', () => {
|
|
498
|
-
const result =
|
|
507
|
+
const result = generate<{ id: number; name: string }>(function* () {
|
|
499
508
|
yield { id: 1, name: 'Alice' };
|
|
500
509
|
yield { id: 2, name: 'Bob' };
|
|
501
510
|
});
|
|
@@ -508,7 +517,7 @@ describe('Arr creations', () => {
|
|
|
508
517
|
});
|
|
509
518
|
|
|
510
519
|
test('generator with different types', () => {
|
|
511
|
-
const result =
|
|
520
|
+
const result = generate<string | number>(function* () {
|
|
512
521
|
yield 'hello';
|
|
513
522
|
yield 42;
|
|
514
523
|
yield 'world';
|
|
@@ -519,8 +528,8 @@ describe('Arr creations', () => {
|
|
|
519
528
|
});
|
|
520
529
|
|
|
521
530
|
test('generator with loops', () => {
|
|
522
|
-
const result =
|
|
523
|
-
for (const i of
|
|
531
|
+
const result = generate<number>(function* () {
|
|
532
|
+
for (const i of rangeIterator(3)) {
|
|
524
533
|
yield i;
|
|
525
534
|
}
|
|
526
535
|
});
|
|
@@ -530,11 +539,51 @@ describe('Arr creations', () => {
|
|
|
530
539
|
});
|
|
531
540
|
});
|
|
532
541
|
|
|
533
|
-
describe('
|
|
534
|
-
test('
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
542
|
+
describe('generateAsync', () => {
|
|
543
|
+
test('should generate array from async generator', async () => {
|
|
544
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
545
|
+
const result = await generateAsync<number>(async function* () {
|
|
546
|
+
yield 1;
|
|
547
|
+
yield 2;
|
|
548
|
+
yield 3;
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
expectType<typeof result, readonly number[]>('=');
|
|
552
|
+
expect(result).toStrictEqual([1, 2, 3]);
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
test('should handle async operations in generator', async () => {
|
|
556
|
+
const result = await generateAsync<string>(async function* () {
|
|
557
|
+
await Promise.resolve();
|
|
558
|
+
yield 'a';
|
|
559
|
+
await Promise.resolve();
|
|
560
|
+
yield 'b';
|
|
561
|
+
await Promise.resolve();
|
|
562
|
+
yield 'c';
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
expect(result).toStrictEqual(['a', 'b', 'c']);
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
test('should generate empty array from empty async generator', async () => {
|
|
569
|
+
const result = await generateAsync<number>(async function* () {
|
|
570
|
+
// Empty generator
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
expect(result).toStrictEqual([]);
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
test('should handle async generator with delays', async () => {
|
|
577
|
+
const result = await generateAsync<number>(async function* () {
|
|
578
|
+
// eslint-disable-next-line functional/no-let
|
|
579
|
+
for (let i = 0; i < 3; i++) {
|
|
580
|
+
// eslint-disable-next-line no-promise-executor-return, no-await-in-loop
|
|
581
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
582
|
+
yield i;
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
expect(result).toStrictEqual([0, 1, 2]);
|
|
538
587
|
});
|
|
539
588
|
});
|
|
540
589
|
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Optional, pipe } from '../../functional/index.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Safely retrieves an element at a given index from an array, returning an Optional.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const letters: readonly string[] = ['a', 'b', 'c'];
|
|
10
|
+
*
|
|
11
|
+
* const two = Arr.at(letters, 1);
|
|
12
|
+
* const last = Arr.at(-1)(letters);
|
|
13
|
+
* const missing = Arr.at(letters, 5);
|
|
14
|
+
*
|
|
15
|
+
* assert.deepStrictEqual(two, Optional.some('b'));
|
|
16
|
+
* assert.deepStrictEqual(last, Optional.some('c'));
|
|
17
|
+
* assert.deepStrictEqual(missing, Optional.none);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function at<const Ar extends readonly unknown[]>(
|
|
21
|
+
array: Ar,
|
|
22
|
+
index: ArgArrayIndexWithNegative<Ar>,
|
|
23
|
+
): Optional<Ar[number]>;
|
|
24
|
+
|
|
25
|
+
// Curried version
|
|
26
|
+
|
|
27
|
+
export function at(
|
|
28
|
+
index: SizeType.ArgArrWithNegative,
|
|
29
|
+
): <E>(array: readonly E[]) => Optional<E>;
|
|
30
|
+
|
|
31
|
+
export function at<E>(
|
|
32
|
+
...args:
|
|
33
|
+
| readonly [array: readonly E[], index: SizeType.ArgArrWithNegative]
|
|
34
|
+
| readonly [index: SizeType.ArgArrWithNegative]
|
|
35
|
+
): Optional<E> | ((array: readonly E[]) => Optional<E>) {
|
|
36
|
+
switch (args.length) {
|
|
37
|
+
case 2: {
|
|
38
|
+
const [array, index] = args;
|
|
39
|
+
return pipe(index < 0 ? array.length + index : index).map(
|
|
40
|
+
(normalizedIndex) =>
|
|
41
|
+
normalizedIndex < 0 || normalizedIndex >= array.length
|
|
42
|
+
? Optional.none
|
|
43
|
+
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
44
|
+
Optional.some(array[normalizedIndex]!),
|
|
45
|
+
).value;
|
|
46
|
+
}
|
|
47
|
+
case 1: {
|
|
48
|
+
const [index] = args;
|
|
49
|
+
return (array) => at(array, index);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Returns the first element of an array as an Optional.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const users = [{ id: 1 }, { id: 2 }];
|
|
61
|
+
* const empty: { id: number }[] = [];
|
|
62
|
+
*
|
|
63
|
+
* const first = Arr.head(users);
|
|
64
|
+
* const none = Arr.head(empty);
|
|
65
|
+
*
|
|
66
|
+
* assert.deepStrictEqual(first, Optional.some({ id: 1 }));
|
|
67
|
+
* assert.deepStrictEqual(none, Optional.none);
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export const head = <const Ar extends readonly unknown[]>(
|
|
71
|
+
array: Ar,
|
|
72
|
+
): Ar extends readonly []
|
|
73
|
+
? Optional.None
|
|
74
|
+
: Ar extends readonly [infer E, ...unknown[]]
|
|
75
|
+
? Optional.Some<E>
|
|
76
|
+
: Ar extends NonEmptyArray<infer E>
|
|
77
|
+
? Optional.Some<E>
|
|
78
|
+
: Optional<Ar[number]> =>
|
|
79
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
80
|
+
(array.length === 0 ? Optional.none : Optional.some(array.at(0))) as never;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Returns the last element of an array as an Optional.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* const queue = ['first', 'second'];
|
|
89
|
+
* const emptyQueue: string[] = [];
|
|
90
|
+
*
|
|
91
|
+
* const lastValue = Arr.last(queue);
|
|
92
|
+
* const none = Arr.last(emptyQueue);
|
|
93
|
+
*
|
|
94
|
+
* assert.deepStrictEqual(lastValue, Optional.some('second'));
|
|
95
|
+
* assert.deepStrictEqual(none, Optional.none);
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export const last = <const Ar extends readonly unknown[]>(
|
|
99
|
+
array: Ar,
|
|
100
|
+
): Ar extends readonly []
|
|
101
|
+
? Optional.None
|
|
102
|
+
: Ar extends readonly [...unknown[], infer E]
|
|
103
|
+
? Optional.Some<E>
|
|
104
|
+
: Ar extends NonEmptyArray<infer E>
|
|
105
|
+
? Optional.Some<E>
|
|
106
|
+
: Optional<Ar[number]> =>
|
|
107
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
108
|
+
(array.length === 0 ? Optional.none : Optional.some(array.at(-1))) as never;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Alias for `head`.
|
|
112
|
+
*
|
|
113
|
+
* @see {@link head}
|
|
114
|
+
*/
|
|
115
|
+
export const first = head;
|