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,346 @@
|
|
|
1
|
+
import { expectType } from '../../expect-type.mjs';
|
|
2
|
+
import { Optional } from '../../functional/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
find,
|
|
5
|
+
findIndex,
|
|
6
|
+
findLast,
|
|
7
|
+
findLastIndex,
|
|
8
|
+
indexOf,
|
|
9
|
+
indexOfFrom,
|
|
10
|
+
lastIndexOf,
|
|
11
|
+
lastIndexOfFrom,
|
|
12
|
+
} from './array-utils-search.mjs';
|
|
13
|
+
|
|
14
|
+
describe('Arr search operations', () => {
|
|
15
|
+
describe('find', () => {
|
|
16
|
+
test('should find first element matching predicate', () => {
|
|
17
|
+
const numbers = [1, 2, 3, 4, 5];
|
|
18
|
+
const firstEven = find(numbers, (n) => n % 2 === 0);
|
|
19
|
+
expect(Optional.isSome(firstEven)).toBe(true);
|
|
20
|
+
expect(Optional.unwrap(firstEven)).toBe(2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('should return None when no element matches', () => {
|
|
24
|
+
const odds = [1, 3, 5];
|
|
25
|
+
const firstEven = find(odds, (n) => n % 2 === 0);
|
|
26
|
+
expect(Optional.isNone(firstEven)).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('should work with curried version', () => {
|
|
30
|
+
const isEven = (n: number): boolean => n % 2 === 0;
|
|
31
|
+
const findEven = find<number>(isEven);
|
|
32
|
+
|
|
33
|
+
const result1 = findEven([1, 2, 3]);
|
|
34
|
+
const result2 = findEven([1, 3, 5]);
|
|
35
|
+
|
|
36
|
+
expect(Optional.isSome(result1)).toBe(true);
|
|
37
|
+
expect(Optional.unwrap(result1)).toBe(2);
|
|
38
|
+
expect(Optional.isNone(result2)).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('should work with type guard predicate', () => {
|
|
42
|
+
const values: readonly (string | number)[] = [1, 'a', 2, 'b'];
|
|
43
|
+
const firstString = find(
|
|
44
|
+
values,
|
|
45
|
+
(x): x is string => typeof x === 'string',
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expectType<typeof firstString, Optional<string>>('=');
|
|
49
|
+
expect(Optional.isSome(firstString)).toBe(true);
|
|
50
|
+
expect(Optional.unwrap(firstString)).toBe('a');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('should provide index and array to predicate', () => {
|
|
54
|
+
const numbers = [10, 20, 30];
|
|
55
|
+
const foundWithIndex = find(numbers, (value, index, arr) => {
|
|
56
|
+
expect(arr).toBe(numbers);
|
|
57
|
+
return index === 1 && value === 20;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
expect(Optional.unwrap(foundWithIndex)).toBe(20);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('should return first match when multiple elements match', () => {
|
|
64
|
+
const numbers = [2, 4, 6, 8];
|
|
65
|
+
const firstEven = find(numbers, (n) => n % 2 === 0);
|
|
66
|
+
expect(Optional.unwrap(firstEven)).toBe(2);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('should work with empty array', () => {
|
|
70
|
+
const empty: readonly number[] = [];
|
|
71
|
+
const result = find(empty, () => true);
|
|
72
|
+
expect(Optional.isNone(result)).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('findLast', () => {
|
|
77
|
+
test('should find last element matching predicate', () => {
|
|
78
|
+
const numbers = [1, 2, 3, 4, 5];
|
|
79
|
+
const lastEven = findLast(numbers, (n) => n % 2 === 0);
|
|
80
|
+
expect(Optional.isSome(lastEven)).toBe(true);
|
|
81
|
+
expect(Optional.unwrap(lastEven)).toBe(4);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('should return None when no element matches', () => {
|
|
85
|
+
const odds = [1, 3, 5];
|
|
86
|
+
const lastEven = findLast(odds, (n) => n % 2 === 0);
|
|
87
|
+
expect(Optional.isNone(lastEven)).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should work with curried version', () => {
|
|
91
|
+
const isPositive = (n: number): boolean => n > 0;
|
|
92
|
+
const findLastPositive = findLast(isPositive);
|
|
93
|
+
const result = findLastPositive([-1, 2, -3, 4]);
|
|
94
|
+
expect(Optional.isSome(result)).toBe(true);
|
|
95
|
+
expect(Optional.unwrap(result)).toBe(4);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('should work with empty array', () => {
|
|
99
|
+
const empty: number[] = [];
|
|
100
|
+
const result = findLast(empty, (n) => n > 0);
|
|
101
|
+
expect(Optional.isNone(result)).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('should pass index and array to predicate', () => {
|
|
105
|
+
const numbers = [10, 20, 30, 40];
|
|
106
|
+
const lastWithIndex2 = findLast(numbers, (_, idx, arr) => {
|
|
107
|
+
expect(arr).toBe(numbers);
|
|
108
|
+
return idx === 2;
|
|
109
|
+
});
|
|
110
|
+
expect(Optional.unwrap(lastWithIndex2)).toBe(30);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('should find last occurrence', () => {
|
|
114
|
+
const numbers = [1, 2, 2, 3, 2, 4];
|
|
115
|
+
const lastTwo = findLast(numbers, (n) => n === 2);
|
|
116
|
+
expect(Optional.unwrap(lastTwo)).toBe(2);
|
|
117
|
+
|
|
118
|
+
// Verify it's actually the last occurrence by checking behavior
|
|
119
|
+
const index = numbers.lastIndexOf(2);
|
|
120
|
+
expect(index).toBe(4); // Last 2 is at index 4
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('findIndex', () => {
|
|
125
|
+
test('should find index of matching element', () => {
|
|
126
|
+
const arr = ['a', 'b', 'c'];
|
|
127
|
+
const result = findIndex(arr, (x) => x === 'b');
|
|
128
|
+
|
|
129
|
+
expect(result).toBeGreaterThanOrEqual(0);
|
|
130
|
+
expectType<typeof result, SizeType.Arr | -1>('=');
|
|
131
|
+
expect(result).toBe(1);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('should return None for no match', () => {
|
|
135
|
+
const arr = ['a', 'b', 'c'];
|
|
136
|
+
const result = findIndex(arr, (x) => x === 'd');
|
|
137
|
+
|
|
138
|
+
expect(result).toBe(-1);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe('findLastIndex', () => {
|
|
143
|
+
test('should find last index matching predicate', () => {
|
|
144
|
+
const numbers = [1, 2, 3, 4, 2, 5];
|
|
145
|
+
const lastTwoIndex = findLastIndex(numbers, (n) => n === 2);
|
|
146
|
+
expect(lastTwoIndex).toBe(4);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('should return -1 when no element matches', () => {
|
|
150
|
+
const odds = [1, 3, 5];
|
|
151
|
+
const lastEvenIndex = findLastIndex(odds, (n) => n % 2 === 0);
|
|
152
|
+
expect(lastEvenIndex).toBe(-1);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('should work with curried version', () => {
|
|
156
|
+
const isPositive = (n: number): boolean => n > 0;
|
|
157
|
+
const findLastPositiveIndex = findLastIndex(isPositive);
|
|
158
|
+
const result = findLastPositiveIndex([-1, 2, -3, 4, -5]);
|
|
159
|
+
expect(result).toBe(3); // index of last positive number (4)
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('should work with empty array', () => {
|
|
163
|
+
const empty: number[] = [];
|
|
164
|
+
const result = findLastIndex(empty, (n) => n > 0);
|
|
165
|
+
expect(result).toBe(-1);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test('should pass index and array to predicate', () => {
|
|
169
|
+
const numbers = [10, 20, 30, 40];
|
|
170
|
+
const lastWithIndex2OrHigher = findLastIndex(numbers, (_, idx, arr) => {
|
|
171
|
+
expect(arr).toBe(numbers);
|
|
172
|
+
return idx >= 2;
|
|
173
|
+
});
|
|
174
|
+
expect(lastWithIndex2OrHigher).toBe(3); // last index >= 2
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('should find last occurrence with complex conditions', () => {
|
|
178
|
+
const data = [
|
|
179
|
+
{ id: 1, active: true },
|
|
180
|
+
{ id: 2, active: false },
|
|
181
|
+
{ id: 3, active: true },
|
|
182
|
+
{ id: 4, active: false },
|
|
183
|
+
{ id: 5, active: true },
|
|
184
|
+
];
|
|
185
|
+
const lastActiveIndex = findLastIndex(data, (item) => item.active);
|
|
186
|
+
expect(lastActiveIndex).toBe(4); // last active item
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('should work with tuples', () => {
|
|
190
|
+
const tuple = [10, 20, 30, 20, 40] as const;
|
|
191
|
+
const lastTwentyIndex = findLastIndex(tuple, (x) => x === 20);
|
|
192
|
+
expect(lastTwentyIndex).toBe(3); // last occurrence of 20
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('should search from end to beginning', () => {
|
|
196
|
+
// Verify search order by using side effects
|
|
197
|
+
const numbers = [1, 2, 3, 4, 5];
|
|
198
|
+
const mut_searchOrder: number[] = [];
|
|
199
|
+
|
|
200
|
+
findLastIndex(numbers, (val, idx) => {
|
|
201
|
+
mut_searchOrder.push(idx);
|
|
202
|
+
return val === 3;
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Should search from end: 4, 3, 2 (stops at 2 when found)
|
|
206
|
+
expect(mut_searchOrder).toStrictEqual([4, 3, 2]);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('should handle single element array', () => {
|
|
210
|
+
const single = [42];
|
|
211
|
+
const foundIndex = findLastIndex(single, (n) => n === 42);
|
|
212
|
+
const notFoundIndex = findLastIndex(single, (n) => n === 0);
|
|
213
|
+
|
|
214
|
+
expect(foundIndex).toBe(0);
|
|
215
|
+
expect(notFoundIndex).toBe(-1);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('should work with string arrays', () => {
|
|
219
|
+
const words = ['hello', 'world', 'test', 'hello', 'end'];
|
|
220
|
+
const lastHelloIndex = findLastIndex(words, (word) => word === 'hello');
|
|
221
|
+
expect(lastHelloIndex).toBe(3);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('indexOf', () => {
|
|
226
|
+
test('should find index of element', () => {
|
|
227
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
228
|
+
const result = indexOf(arr, 'b');
|
|
229
|
+
|
|
230
|
+
expect(result).toBeGreaterThanOrEqual(0);
|
|
231
|
+
if (result !== -1) {
|
|
232
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
233
|
+
expect(result).toBe(1);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('should return -1 for non-existent element', () => {
|
|
238
|
+
const arr = ['a', 'b', 'c'];
|
|
239
|
+
const result = indexOf(arr, 'd');
|
|
240
|
+
|
|
241
|
+
expect(result).toBe(-1);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
describe('indexOfFrom', () => {
|
|
246
|
+
test('should find index of element from specified index', () => {
|
|
247
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
248
|
+
const result = indexOfFrom(arr, 'b', 2);
|
|
249
|
+
|
|
250
|
+
expect(result).toBeGreaterThanOrEqual(0);
|
|
251
|
+
if (result !== -1) {
|
|
252
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
253
|
+
expect(result).toBe(3);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test('should return -1 when element not found from index', () => {
|
|
258
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
259
|
+
const result = indexOfFrom(arr, 'a', 1);
|
|
260
|
+
|
|
261
|
+
expect(result).toBe(-1);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test('should find first occurrence when fromIndex is 0', () => {
|
|
265
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
266
|
+
const result = indexOfFrom(arr, 'b', 0);
|
|
267
|
+
|
|
268
|
+
expect(result).toBe(1);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('should handle negative fromIndex', () => {
|
|
272
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
273
|
+
const result = indexOfFrom(arr, 'b', -2);
|
|
274
|
+
|
|
275
|
+
expect(result).toBe(3);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test('should handle fromIndex beyond array length', () => {
|
|
279
|
+
const arr = ['a', 'b', 'c'];
|
|
280
|
+
const result = indexOfFrom(arr, 'a', 10);
|
|
281
|
+
|
|
282
|
+
expect(result).toBe(-1);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
describe('lastIndexOf', () => {
|
|
287
|
+
test('should find last index of element', () => {
|
|
288
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
289
|
+
const result = lastIndexOf(arr, 'b');
|
|
290
|
+
|
|
291
|
+
expect(result).toBeGreaterThanOrEqual(0);
|
|
292
|
+
if (result !== -1) {
|
|
293
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
294
|
+
expect(result).toBe(3);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test('should return -1 for non-existent element', () => {
|
|
299
|
+
const arr = ['a', 'b', 'c'];
|
|
300
|
+
const result = lastIndexOf(arr, 'd');
|
|
301
|
+
|
|
302
|
+
expect(result).toBe(-1);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
describe('lastIndexOfFrom', () => {
|
|
307
|
+
test('should find last index of element from specified index', () => {
|
|
308
|
+
const arr = ['a', 'b', 'c', 'b', 'e'];
|
|
309
|
+
const result = lastIndexOfFrom(arr, 'b', 2);
|
|
310
|
+
|
|
311
|
+
expect(result).toBeGreaterThanOrEqual(0);
|
|
312
|
+
if (result !== -1) {
|
|
313
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
314
|
+
expect(result).toBe(1);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
test('should return -1 when element not found before index', () => {
|
|
319
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
320
|
+
const result = lastIndexOfFrom(arr, 'b', 0);
|
|
321
|
+
|
|
322
|
+
expect(result).toBe(-1);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
test('should find last occurrence when fromIndex covers all elements', () => {
|
|
326
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
327
|
+
const result = lastIndexOfFrom(arr, 'b', 10);
|
|
328
|
+
|
|
329
|
+
expect(result).toBe(3);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test('should handle negative fromIndex', () => {
|
|
333
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
334
|
+
const result = lastIndexOfFrom(arr, 'b', -1);
|
|
335
|
+
|
|
336
|
+
expect(result).toBe(3);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
test('should handle fromIndex of 0', () => {
|
|
340
|
+
const arr = ['a', 'b', 'c', 'b'];
|
|
341
|
+
const result = lastIndexOfFrom(arr, 'a', 0);
|
|
342
|
+
|
|
343
|
+
expect(result).toBe(0);
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if two arrays are equal by comparing their elements.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const numbers = [1, 2, 3] as const;
|
|
8
|
+
* const sameNumbers = [1, 2, 3] as const;
|
|
9
|
+
* const differentNumbers = [1, 2, 4] as const;
|
|
10
|
+
*
|
|
11
|
+
* assert.ok(Arr.eq(numbers, sameNumbers));
|
|
12
|
+
* assert.notOk(Arr.eq(numbers, differentNumbers));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const eq = <E,>(
|
|
16
|
+
array1: readonly E[],
|
|
17
|
+
array2: readonly E[],
|
|
18
|
+
equality: (a: E, b: E) => boolean = Object.is,
|
|
19
|
+
): boolean =>
|
|
20
|
+
array1.length === array2.length &&
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
22
|
+
array1.every((v, i) => equality(v, array2[i]!));
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Alias for `eq`.
|
|
26
|
+
*
|
|
27
|
+
* @see {@link eq}
|
|
28
|
+
*/
|
|
29
|
+
export const equal = eq;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Checks if the first array is a subset of the second array.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const subset = [1, 2] as const;
|
|
38
|
+
* const superset = [1, 2, 3] as const;
|
|
39
|
+
* const notSubset = [2, 4] as const;
|
|
40
|
+
*
|
|
41
|
+
* assert.ok(Arr.isSubset(subset, superset));
|
|
42
|
+
* assert.notOk(Arr.isSubset(notSubset, superset));
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const isSubset = <E1 extends Primitive, E2 extends Primitive = E1>(
|
|
46
|
+
array1: readonly E1[],
|
|
47
|
+
array2: readonly E2[],
|
|
48
|
+
): boolean =>
|
|
49
|
+
array1.every((a) =>
|
|
50
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
51
|
+
array2.includes(a as E1 & E2),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks if the first array is a superset of the second array.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const potentialSuperset = ['a', 'b', 'c'] as const;
|
|
61
|
+
* const subset = ['a', 'c'] as const;
|
|
62
|
+
* const notSuperset = ['a', 'd'] as const;
|
|
63
|
+
*
|
|
64
|
+
* assert.ok(Arr.isSuperset(potentialSuperset, subset));
|
|
65
|
+
* assert.notOk(Arr.isSuperset(subset, potentialSuperset));
|
|
66
|
+
* assert.notOk(Arr.isSuperset(potentialSuperset, notSuperset));
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export const isSuperset = <E1 extends Primitive, E2 extends Primitive = E1>(
|
|
70
|
+
array1: readonly E1[],
|
|
71
|
+
array2: readonly E2[],
|
|
72
|
+
): boolean => isSubset(array2, array1);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns the intersection of two arrays.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* const refs = ['Ada', 'Alan', 'Grace'] as const;
|
|
81
|
+
* const attendees = ['Grace', 'Alan', 'Barbara'] as const;
|
|
82
|
+
*
|
|
83
|
+
* const both = Arr.setIntersection(refs, attendees);
|
|
84
|
+
*
|
|
85
|
+
* assert.deepStrictEqual(both, ['Alan', 'Grace']);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export const setIntersection = <
|
|
89
|
+
E1 extends Primitive,
|
|
90
|
+
E2 extends Primitive = E1,
|
|
91
|
+
>(
|
|
92
|
+
array1: readonly E1[],
|
|
93
|
+
array2: readonly E2[],
|
|
94
|
+
): readonly (E1 & E2)[] =>
|
|
95
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
96
|
+
array1.filter((e) => array2.includes(e as E1 & E2)) as (E1 & E2)[];
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Returns the set difference of two arrays (elements in first but not in second).
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
*
|
|
103
|
+
* ```ts
|
|
104
|
+
* const baseline = [1, 2, 3, 4] as const;
|
|
105
|
+
* const removed = [2, 4] as const;
|
|
106
|
+
*
|
|
107
|
+
* const remaining = Arr.setDifference(baseline, removed);
|
|
108
|
+
*
|
|
109
|
+
* assert.deepStrictEqual(remaining, [1, 3]);
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export const setDifference = <E extends Primitive>(
|
|
113
|
+
array1: readonly E[],
|
|
114
|
+
array2: readonly E[],
|
|
115
|
+
): readonly E[] => array1.filter((e) => !array2.includes(e));
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Returns the set difference of two sorted numeric arrays (optimized for sorted arrays).
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
*
|
|
122
|
+
* ```ts
|
|
123
|
+
* const upcoming = [1, 3, 5, 7, 9] as const;
|
|
124
|
+
* const completed = [3, 4, 7] as const;
|
|
125
|
+
*
|
|
126
|
+
* const remaining = Arr.sortedNumSetDifference(upcoming, completed);
|
|
127
|
+
*
|
|
128
|
+
* const expected = [1, 5, 9] as const;
|
|
129
|
+
*
|
|
130
|
+
* assert.deepStrictEqual(remaining, expected);
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export const sortedNumSetDifference = <E extends number>(
|
|
134
|
+
sortedList1: readonly E[],
|
|
135
|
+
sortedList2: readonly E[],
|
|
136
|
+
): readonly E[] => {
|
|
137
|
+
const mut_result: E[] = [];
|
|
138
|
+
let mut_it1 = 0; // iterator for sortedList1
|
|
139
|
+
let mut_it2 = 0; // iterator for sortedList2
|
|
140
|
+
|
|
141
|
+
while (mut_it1 < sortedList1.length && mut_it2 < sortedList2.length) {
|
|
142
|
+
// Non-null assertions are safe due to loop condition
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
144
|
+
const val1 = sortedList1[mut_it1]!;
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
146
|
+
const val2 = sortedList2[mut_it2]!;
|
|
147
|
+
|
|
148
|
+
if (val1 === val2) {
|
|
149
|
+
mut_it1 += 1;
|
|
150
|
+
mut_it2 += 1;
|
|
151
|
+
} else if (val1 < val2) {
|
|
152
|
+
mut_result.push(val1);
|
|
153
|
+
mut_it1 += 1;
|
|
154
|
+
} else {
|
|
155
|
+
// val1 > val2
|
|
156
|
+
mut_it2 += 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Add remaining elements from sortedList1
|
|
160
|
+
for (; mut_it1 < sortedList1.length; mut_it1 += 1) {
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
162
|
+
mut_result.push(sortedList1[mut_it1]!);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return mut_result;
|
|
166
|
+
};
|