ts-data-forge 14.7.1 → 14.8.0
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 +21 -34
- package/dist/array/impl/array-utils-creation.d.mts +3 -3
- package/dist/array/impl/array-utils-creation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-creation.mjs.map +1 -1
- package/dist/array/impl/array-utils-element-access.d.mts +2 -2
- package/dist/array/impl/array-utils-element-access.d.mts.map +1 -1
- package/dist/array/impl/array-utils-element-access.mjs +1 -1
- package/dist/array/impl/array-utils-element-access.mjs.map +1 -1
- package/dist/array/impl/array-utils-iterators.d.mts +1 -1
- package/dist/array/impl/array-utils-iterators.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts +9 -9
- package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts +2 -2
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts +3 -3
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs.map +1 -1
- package/dist/array/impl/array-utils-modification.d.mts +2 -2
- package/dist/array/impl/array-utils-modification.d.mts.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.d.mts +2 -2
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +3 -4
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-search.d.mts +1 -1
- package/dist/array/impl/array-utils-search.d.mts.map +1 -1
- package/dist/array/impl/array-utils-set-op.d.mts +1 -1
- package/dist/array/impl/array-utils-set-op.d.mts.map +1 -1
- package/dist/array/impl/array-utils-size.d.mts +2 -2
- package/dist/array/impl/array-utils-size.d.mts.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.d.mts +1 -1
- package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -1
- package/dist/array/impl/array-utils-slicing.d.mts +2 -2
- package/dist/array/impl/array-utils-slicing.d.mts.map +1 -1
- package/dist/array/impl/array-utils-transformation.d.mts +2 -2
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +6 -3
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.d.mts +2 -2
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
- package/dist/collections/imap-mapped.d.mts +2 -2
- package/dist/collections/imap-mapped.d.mts.map +1 -1
- package/dist/collections/imap-mapped.mjs +10 -7
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.d.mts +2 -2
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +10 -7
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +2 -2
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +6 -3
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +2 -2
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs +5 -5
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.d.mts +1 -1
- package/dist/collections/queue.d.mts.map +1 -1
- package/dist/collections/stack.d.mts +1 -1
- package/dist/collections/stack.d.mts.map +1 -1
- package/dist/guard/is-non-empty-string.d.mts +1 -1
- package/dist/guard/is-non-empty-string.d.mts.map +1 -1
- package/dist/guard/is-primitive.d.mts +1 -1
- package/dist/guard/is-primitive.d.mts.map +1 -1
- package/dist/guard/is-type.d.mts +1 -1
- package/dist/guard/is-type.d.mts.map +1 -1
- package/dist/iterator/range.d.mts +5 -4
- package/dist/iterator/range.d.mts.map +1 -1
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.d.mts +29 -32
- package/dist/json/json.d.mts.map +1 -1
- package/dist/json/json.mjs +1 -4
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +1 -1
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/int.d.mts +2 -2
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int16.d.mts +1 -1
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int32.d.mts +1 -1
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/negative-int.d.mts +1 -1
- package/dist/number/branded-types/negative-int.d.mts.map +1 -1
- package/dist/number/branded-types/negative-safe-int.d.mts +1 -1
- package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-int.d.mts +1 -1
- package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.d.mts +1 -1
- package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +2 -2
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +1 -1
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +1 -1
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +2 -2
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +2 -2
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +1 -1
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.d.mts +2 -2
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +1 -1
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +1 -1
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/enum/int8.d.mts +1 -1
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/uint8.d.mts +1 -1
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/num-arithmetic-types.d.mts +1 -1
- package/dist/number/num-arithmetic-types.d.mts.map +1 -1
- package/dist/number/num.d.mts +3 -3
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/refined-number-utils.d.mts +2 -2
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +6 -4
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.d.mts +5 -8
- package/dist/object/object.d.mts.map +1 -1
- package/dist/object/object.mjs +16 -13
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/cast-mutable.d.mts +1 -1
- package/dist/others/cast-mutable.d.mts.map +1 -1
- package/dist/others/cast-readonly.d.mts +1 -1
- package/dist/others/cast-readonly.d.mts.map +1 -1
- package/dist/others/debounce-function.d.mts.map +1 -1
- package/dist/others/debounce-function.mjs +1 -5
- package/dist/others/debounce-function.mjs.map +1 -1
- package/dist/others/memoize-function.d.mts +1 -1
- package/dist/others/memoize-function.d.mts.map +1 -1
- package/dist/string/str.d.mts +26 -18
- package/dist/string/str.d.mts.map +1 -1
- package/dist/string/str.mjs +9 -1
- package/dist/string/str.mjs.map +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.mts.map +1 -1
- package/package.json +31 -30
- package/src/array/impl/array-utils-creation.mts +24 -22
- package/src/array/impl/array-utils-creation.test.mts +25 -22
- package/src/array/impl/array-utils-element-access.mts +7 -7
- package/src/array/impl/array-utils-element-access.test.mts +2 -2
- package/src/array/impl/array-utils-iterators.mts +1 -1
- package/src/array/impl/array-utils-iterators.test.mts +1 -1
- package/src/array/impl/array-utils-length-bounded-array-cast.mts +7 -7
- package/src/array/impl/array-utils-length-bounded-array-cast.test.mts +6 -6
- package/src/array/impl/array-utils-length-bounded-array-guard.mts +15 -15
- package/src/array/impl/array-utils-length-bounded-array-guard.test.mts +66 -54
- package/src/array/impl/array-utils-length-bounded-tuple-cast.mts +6 -6
- package/src/array/impl/array-utils-length-bounded-tuple-cast.test.mts +10 -10
- package/src/array/impl/array-utils-length-bounded-tuple-guard.mts +8 -8
- package/src/array/impl/array-utils-length-bounded-tuple-guard.test.mts +38 -28
- package/src/array/impl/array-utils-length-constraint-preservation.test.mts +14 -14
- package/src/array/impl/array-utils-modification.mts +12 -12
- package/src/array/impl/array-utils-modification.test.mts +7 -7
- package/src/array/impl/array-utils-overload-type-error.test.mts +1 -1
- package/src/array/impl/array-utils-reducing-value.mts +9 -11
- package/src/array/impl/array-utils-reducing-value.test.mts +2 -2
- package/src/array/impl/array-utils-search.mts +4 -4
- package/src/array/impl/array-utils-search.test.mts +25 -17
- package/src/array/impl/array-utils-set-op.mts +1 -1
- package/src/array/impl/array-utils-shape-invariants.test.mts +8 -8
- package/src/array/impl/array-utils-size.mts +5 -5
- package/src/array/impl/array-utils-slice-clamped.mts +2 -2
- package/src/array/impl/array-utils-slicing.mts +8 -8
- package/src/array/impl/array-utils-slicing.test.mts +1 -1
- package/src/array/impl/array-utils-transformation.mts +26 -24
- package/src/array/impl/array-utils-transformation.test.mts +12 -10
- package/src/array/impl/array-utils-validation.mts +7 -7
- package/src/array/impl/array-utils-validation.test.mts +39 -39
- package/src/array/impl/array.test.mts +1 -1
- package/src/collections/imap-mapped.mts +15 -9
- package/src/collections/imap-mapped.test.mts +1 -1
- package/src/collections/imap.mts +15 -9
- package/src/collections/imap.test.mts +7 -5
- package/src/collections/iset-mapped.mts +14 -8
- package/src/collections/iset.mts +12 -10
- package/src/collections/iset.test.mts +14 -12
- package/src/collections/queue.mts +1 -1
- package/src/collections/stack.mts +1 -1
- package/src/collections/stack.test.mts +8 -6
- package/src/guard/is-error.test.mts +6 -4
- package/src/guard/is-non-empty-string.mts +1 -1
- package/src/guard/is-non-empty-string.test.mts +15 -11
- package/src/guard/is-primitive.mts +1 -1
- package/src/guard/is-type.mts +1 -1
- package/src/guard/is-type.test.mts +87 -59
- package/src/iterator/range.mts +5 -9
- package/src/iterator/range.test.mts +29 -0
- package/src/json/json.mts +32 -35
- package/src/json/json.test.mts +106 -89
- package/src/number/branded-types/finite-number.mts +4 -4
- package/src/number/branded-types/int.mts +2 -2
- package/src/number/branded-types/int16.mts +1 -1
- package/src/number/branded-types/int32.mts +1 -1
- package/src/number/branded-types/negative-finite-number.mts +1 -1
- package/src/number/branded-types/negative-finite-number.test.mts +4 -4
- package/src/number/branded-types/negative-int.mts +3 -3
- package/src/number/branded-types/negative-int.test.mts +1 -1
- package/src/number/branded-types/negative-safe-int.mts +3 -3
- package/src/number/branded-types/negative-safe-int.test.mts +1 -1
- package/src/number/branded-types/non-negative-finite-number.mts +3 -3
- package/src/number/branded-types/non-negative-int16.mts +1 -1
- package/src/number/branded-types/non-negative-int32.mts +1 -1
- package/src/number/branded-types/non-positive-finite-number.mts +1 -1
- package/src/number/branded-types/non-positive-int.mts +1 -1
- package/src/number/branded-types/non-positive-safe-int.mts +1 -1
- package/src/number/branded-types/non-zero-finite-number.mts +5 -5
- package/src/number/branded-types/non-zero-int.mts +1 -1
- package/src/number/branded-types/non-zero-int16.mts +1 -1
- package/src/number/branded-types/non-zero-int32.mts +1 -1
- package/src/number/branded-types/non-zero-safe-int.mts +4 -4
- package/src/number/branded-types/non-zero-uint16.mts +1 -1
- package/src/number/branded-types/non-zero-uint32.mts +1 -1
- package/src/number/branded-types/positive-finite-number.mts +4 -4
- package/src/number/branded-types/positive-int.mts +2 -2
- package/src/number/branded-types/positive-int16.mts +1 -1
- package/src/number/branded-types/positive-int32.mts +1 -1
- package/src/number/branded-types/positive-safe-int.mts +4 -4
- package/src/number/branded-types/positive-uint16.mts +1 -1
- package/src/number/branded-types/positive-uint32.mts +1 -1
- package/src/number/branded-types/safe-int.mts +2 -5
- package/src/number/branded-types/safe-uint.mts +1 -1
- package/src/number/branded-types/uint.mts +2 -2
- package/src/number/branded-types/uint16.mts +1 -1
- package/src/number/branded-types/uint32.mts +1 -1
- package/src/number/enum/int8.mts +5 -5
- package/src/number/enum/uint8.mts +4 -4
- package/src/number/num-arithmetic-types.mts +27 -27
- package/src/number/num-arithmetic-types.test.mts +21 -21
- package/src/number/num-arithmetic.test.mts +6 -6
- package/src/number/num.mts +24 -24
- package/src/number/num.test.mts +1 -1
- package/src/number/refined-number-utils.mts +25 -21
- package/src/object/object.mts +46 -34
- package/src/object/object.test.mts +5 -5
- package/src/others/cast-mutable.mts +1 -1
- package/src/others/cast-readonly.mts +1 -1
- package/src/others/debounce-function.mts +1 -5
- package/src/others/fast-deep-equal.test.mts +1 -1
- package/src/others/map-nullable.test.mts +1 -1
- package/src/others/memoize-function.mts +1 -1
- package/src/string/str.mts +33 -25
- package/src/string/str.test.mts +48 -38
- package/src/types.mts +14 -14
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prefer-iterator-to-array-at-end */
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import type {
|
|
3
|
+
FixedLengthTuple,
|
|
4
|
+
ReadonlyRecord,
|
|
5
|
+
WidenLiteral,
|
|
6
6
|
} from 'ts-type-forge';
|
|
7
7
|
import { asUint32 } from '../number/index.mjs';
|
|
8
8
|
import { unknownToString } from '../others/index.mjs';
|
|
9
|
-
import {
|
|
9
|
+
import type { MapSetKeyType, SizeType } from '../types.mjs';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Interface for an immutable set with custom element mapping and membership
|
|
@@ -1240,7 +1240,9 @@ class ISetMappedClass<K, KM extends MapSetKeyType>
|
|
|
1240
1240
|
/** @inheritdoc */
|
|
1241
1241
|
every(predicate: (key: K) => boolean): boolean {
|
|
1242
1242
|
for (const key of this.values()) {
|
|
1243
|
-
if (!predicate(key))
|
|
1243
|
+
if (!predicate(key)) {
|
|
1244
|
+
return false;
|
|
1245
|
+
}
|
|
1244
1246
|
}
|
|
1245
1247
|
|
|
1246
1248
|
return true;
|
|
@@ -1249,7 +1251,9 @@ class ISetMappedClass<K, KM extends MapSetKeyType>
|
|
|
1249
1251
|
/** @inheritdoc */
|
|
1250
1252
|
some(predicate: (key: K) => boolean): boolean {
|
|
1251
1253
|
for (const key of this.values()) {
|
|
1252
|
-
if (predicate(key))
|
|
1254
|
+
if (predicate(key)) {
|
|
1255
|
+
return true;
|
|
1256
|
+
}
|
|
1253
1257
|
}
|
|
1254
1258
|
|
|
1255
1259
|
return false;
|
|
@@ -1257,7 +1261,9 @@ class ISetMappedClass<K, KM extends MapSetKeyType>
|
|
|
1257
1261
|
|
|
1258
1262
|
/** @inheritdoc */
|
|
1259
1263
|
add(key: K): ISetMapped<K, KM> {
|
|
1260
|
-
if (this.has(key))
|
|
1264
|
+
if (this.has(key)) {
|
|
1265
|
+
return this;
|
|
1266
|
+
}
|
|
1261
1267
|
|
|
1262
1268
|
return ISetMapped.create(
|
|
1263
1269
|
[...this.#set, this.#toKey(key)].map(this.#fromKey),
|
package/src/collections/iset.mts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prefer-iterator-to-array-at-end */
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import type {
|
|
3
|
+
FixedLengthTuple,
|
|
4
|
+
ReadonlyRecord,
|
|
5
|
+
WidenLiteral,
|
|
6
6
|
} from 'ts-type-forge';
|
|
7
7
|
import { asUint32 } from '../number/index.mjs';
|
|
8
8
|
import { unknownToString } from '../others/index.mjs';
|
|
9
|
-
import {
|
|
9
|
+
import type { MapSetKeyType, SizeType } from '../types.mjs';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Interface for an immutable set with membership testing and set operation
|
|
@@ -766,7 +766,9 @@ class ISetClass<K extends MapSetKeyType> implements ISet<K>, Iterable<K> {
|
|
|
766
766
|
/** @inheritdoc */
|
|
767
767
|
every(predicate: (key: K) => boolean): boolean {
|
|
768
768
|
for (const key of this.values()) {
|
|
769
|
-
if (!predicate(key))
|
|
769
|
+
if (!predicate(key)) {
|
|
770
|
+
return false;
|
|
771
|
+
}
|
|
770
772
|
}
|
|
771
773
|
|
|
772
774
|
return true;
|
|
@@ -775,7 +777,9 @@ class ISetClass<K extends MapSetKeyType> implements ISet<K>, Iterable<K> {
|
|
|
775
777
|
/** @inheritdoc */
|
|
776
778
|
some(predicate: (key: K) => boolean): boolean {
|
|
777
779
|
for (const key of this.values()) {
|
|
778
|
-
if (predicate(key))
|
|
780
|
+
if (predicate(key)) {
|
|
781
|
+
return true;
|
|
782
|
+
}
|
|
779
783
|
}
|
|
780
784
|
|
|
781
785
|
return false;
|
|
@@ -783,9 +787,7 @@ class ISetClass<K extends MapSetKeyType> implements ISet<K>, Iterable<K> {
|
|
|
783
787
|
|
|
784
788
|
/** @inheritdoc */
|
|
785
789
|
add(key: K): ISet<K> {
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
return ISet.create([...this.#set, key]);
|
|
790
|
+
return this.has(key) ? this : ISet.create([...this.#set, key]);
|
|
789
791
|
}
|
|
790
792
|
|
|
791
793
|
/** @inheritdoc */
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type {
|
|
2
|
+
DeepReadonly,
|
|
3
|
+
FixedLengthTuple,
|
|
4
|
+
MutableFixedLengthTuple,
|
|
5
|
+
Primitive,
|
|
6
6
|
} from 'ts-type-forge';
|
|
7
7
|
import { expectType } from '../expect-type.mjs';
|
|
8
8
|
import { isString } from '../guard/index.mjs';
|
|
9
|
-
import {
|
|
9
|
+
import type { MapSetKeyType } from '../types.mjs';
|
|
10
10
|
import { ISet } from './iset.mjs';
|
|
11
11
|
|
|
12
12
|
describe('ISet.create', () => {
|
|
@@ -188,13 +188,15 @@ describe('every method as type guard', () => {
|
|
|
188
188
|
test('should narrow type when used as type guard', () => {
|
|
189
189
|
const set = ISet.create<string | number>(['hello', 'world']);
|
|
190
190
|
|
|
191
|
-
if (set.every((value): value is string => typeof value === 'string')) {
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
if (!set.every((value): value is string => typeof value === 'string')) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Type should be narrowed to ISet<string>
|
|
196
|
+
const values = set.toArray();
|
|
194
197
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
+
for (const value of values) {
|
|
199
|
+
assert.isTrue(isString(value));
|
|
198
200
|
}
|
|
199
201
|
});
|
|
200
202
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Optional } from '../functional/index.mjs';
|
|
2
2
|
import { range } from '../iterator/index.mjs';
|
|
3
3
|
import { asSafeUint, asUint32 } from '../number/index.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import type { SizeType } from '../types.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Interface for a high-performance queue with FIFO (First-In, First-Out)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Optional } from '../functional/index.mjs';
|
|
2
2
|
import { range } from '../iterator/index.mjs';
|
|
3
3
|
import { asUint32, Uint32 } from '../number/index.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import type { SizeType } from '../types.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Interface for a high-performance stack with LIFO (Last-In, First-Out)
|
|
@@ -2,7 +2,7 @@ import { expectType } from '../expect-type.mjs';
|
|
|
2
2
|
import { Optional } from '../functional/index.mjs';
|
|
3
3
|
import { range } from '../iterator/index.mjs';
|
|
4
4
|
import { asPositiveSafeInt, asSafeInt } from '../number/index.mjs';
|
|
5
|
-
import {
|
|
5
|
+
import type { SizeType } from '../types.mjs';
|
|
6
6
|
import { createStack, type Stack } from './stack.mjs';
|
|
7
7
|
|
|
8
8
|
describe('Stack test', () => {
|
|
@@ -263,12 +263,14 @@ describe('Stack test', () => {
|
|
|
263
263
|
for (const i of range(100)) {
|
|
264
264
|
stack.push(i);
|
|
265
265
|
|
|
266
|
-
if (i % 2
|
|
267
|
-
|
|
268
|
-
const result = stack.pop();
|
|
269
|
-
|
|
270
|
-
expect(Optional.unwrap(result)).toBe(i);
|
|
266
|
+
if (i % 2 !== 1) {
|
|
267
|
+
continue;
|
|
271
268
|
}
|
|
269
|
+
|
|
270
|
+
// Pop every other time
|
|
271
|
+
const result = stack.pop();
|
|
272
|
+
|
|
273
|
+
expect(Optional.unwrap(result)).toBe(i);
|
|
272
274
|
}
|
|
273
275
|
|
|
274
276
|
// Should have 50 elements remaining (0, 2, 4, ..., 98)
|
|
@@ -111,11 +111,13 @@ describe('isError from @sindresorhus/is', () => {
|
|
|
111
111
|
test('should act as a type guard', () => {
|
|
112
112
|
const value: Error | string = new Error('test');
|
|
113
113
|
|
|
114
|
-
if (isErrorBySindreSorhus(value)) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
expect(value.message).toBe('test');
|
|
114
|
+
if (!isErrorBySindreSorhus(value)) {
|
|
115
|
+
return;
|
|
118
116
|
}
|
|
117
|
+
|
|
118
|
+
expectType<typeof value, Error>('=');
|
|
119
|
+
|
|
120
|
+
expect(value.message).toBe('test');
|
|
119
121
|
});
|
|
120
122
|
|
|
121
123
|
test('should work with AggregateError', () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { NonEmptyString } from 'ts-type-forge';
|
|
2
2
|
import { expectType } from '../expect-type.mjs';
|
|
3
3
|
import { isNonEmptyString } from './is-non-empty-string.mjs';
|
|
4
4
|
|
|
@@ -55,24 +55,28 @@ describe(isNonEmptyString, () => {
|
|
|
55
55
|
const value: unknown = 'test';
|
|
56
56
|
|
|
57
57
|
// @ts-expect-error Testing non-string types
|
|
58
|
-
if (isNonEmptyString(value)) {
|
|
59
|
-
|
|
58
|
+
if (!isNonEmptyString(value)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
expect(value.length).toBeGreaterThan(0);
|
|
62
|
+
expectType<typeof value, NonEmptyString>('=');
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// TypeScript knows it's a string
|
|
65
|
+
expect(value.length).toBeGreaterThan(0);
|
|
66
|
+
|
|
67
|
+
expect(value.at(0)).toBe('t');
|
|
66
68
|
});
|
|
67
69
|
|
|
68
70
|
test('should narrow string | undefined | null types', () => {
|
|
69
71
|
const maybeString: string | undefined | null = 'hello';
|
|
70
72
|
|
|
71
|
-
if (isNonEmptyString(maybeString)) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
expect(maybeString.toUpperCase()).toBe('HELLO');
|
|
73
|
+
if (!isNonEmptyString(maybeString)) {
|
|
74
|
+
return;
|
|
75
75
|
}
|
|
76
|
+
|
|
77
|
+
expectType<typeof maybeString, NonEmptyString>('=');
|
|
78
|
+
|
|
79
|
+
expect(maybeString.toUpperCase()).toBe('HELLO');
|
|
76
80
|
});
|
|
77
81
|
|
|
78
82
|
test('should work in filter operations', () => {
|
package/src/guard/is-type.mts
CHANGED
|
@@ -143,11 +143,13 @@ describe(isString, () => {
|
|
|
143
143
|
test('should act as a type guard', () => {
|
|
144
144
|
const value: unknown = 'test';
|
|
145
145
|
|
|
146
|
-
if (isString(value)) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
expect(value).toHaveLength(4);
|
|
146
|
+
if (!isString(value)) {
|
|
147
|
+
return;
|
|
150
148
|
}
|
|
149
|
+
|
|
150
|
+
expectType<typeof value, string>('=');
|
|
151
|
+
|
|
152
|
+
expect(value).toHaveLength(4);
|
|
151
153
|
});
|
|
152
154
|
});
|
|
153
155
|
|
|
@@ -182,11 +184,13 @@ describe(isNumber, () => {
|
|
|
182
184
|
test('should act as a type guard', () => {
|
|
183
185
|
const value: unknown = 42;
|
|
184
186
|
|
|
185
|
-
if (isNumber(value)) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
expect(value + 1).toBe(43);
|
|
187
|
+
if (!isNumber(value)) {
|
|
188
|
+
return;
|
|
189
189
|
}
|
|
190
|
+
|
|
191
|
+
expectType<typeof value, number>('=');
|
|
192
|
+
|
|
193
|
+
expect(value + 1).toBe(43);
|
|
190
194
|
});
|
|
191
195
|
});
|
|
192
196
|
|
|
@@ -212,11 +216,13 @@ describe(isBigint, () => {
|
|
|
212
216
|
test('should act as a type guard', () => {
|
|
213
217
|
const value: unknown = 123n;
|
|
214
218
|
|
|
215
|
-
if (isBigint(value)) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
expect(value + 1n).toBe(124n);
|
|
219
|
+
if (!isBigint(value)) {
|
|
220
|
+
return;
|
|
219
221
|
}
|
|
222
|
+
|
|
223
|
+
expectType<typeof value, bigint>('=');
|
|
224
|
+
|
|
225
|
+
expect(value + 1n).toBe(124n);
|
|
220
226
|
});
|
|
221
227
|
});
|
|
222
228
|
|
|
@@ -243,11 +249,13 @@ describe(isBoolean, () => {
|
|
|
243
249
|
test('should act as a type guard', () => {
|
|
244
250
|
const value: unknown = true;
|
|
245
251
|
|
|
246
|
-
if (isBoolean(value)) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
assert.isTrue(value);
|
|
252
|
+
if (!isBoolean(value)) {
|
|
253
|
+
return;
|
|
250
254
|
}
|
|
255
|
+
|
|
256
|
+
expectType<typeof value, boolean>('=');
|
|
257
|
+
|
|
258
|
+
assert.isTrue(value);
|
|
251
259
|
});
|
|
252
260
|
});
|
|
253
261
|
|
|
@@ -271,11 +279,13 @@ describe(isSymbol, () => {
|
|
|
271
279
|
test('should act as a type guard', () => {
|
|
272
280
|
const value: unknown = Symbol('test');
|
|
273
281
|
|
|
274
|
-
if (isSymbol(value)) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
expect(value.toString()).toContain('Symbol');
|
|
282
|
+
if (!isSymbol(value)) {
|
|
283
|
+
return;
|
|
278
284
|
}
|
|
285
|
+
|
|
286
|
+
expectType<typeof value, symbol>('=');
|
|
287
|
+
|
|
288
|
+
expect(value.toString()).toContain('Symbol');
|
|
279
289
|
});
|
|
280
290
|
});
|
|
281
291
|
|
|
@@ -307,12 +317,14 @@ describe(isNotBoolean, () => {
|
|
|
307
317
|
test('should act as a type guard', () => {
|
|
308
318
|
const value: string | number | boolean = 'test';
|
|
309
319
|
|
|
310
|
-
if (isNotBoolean(value)) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
// Should not have boolean methods
|
|
314
|
-
assert.isTrue(typeof value === 'string' || typeof value === 'number');
|
|
320
|
+
if (!isNotBoolean(value)) {
|
|
321
|
+
return;
|
|
315
322
|
}
|
|
323
|
+
|
|
324
|
+
expectType<typeof value, string | number>('<=');
|
|
325
|
+
|
|
326
|
+
// Should not have boolean methods
|
|
327
|
+
assert.isTrue(typeof value === 'string' || typeof value === 'number');
|
|
316
328
|
});
|
|
317
329
|
});
|
|
318
330
|
|
|
@@ -354,11 +366,13 @@ describe(isNotNumber, () => {
|
|
|
354
366
|
test('should act as a type guard', () => {
|
|
355
367
|
const value: string | number | boolean = 'test';
|
|
356
368
|
|
|
357
|
-
if (isNotNumber(value)) {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
assert.isTrue(typeof value === 'string' || typeof value === 'boolean');
|
|
369
|
+
if (!isNotNumber(value)) {
|
|
370
|
+
return;
|
|
361
371
|
}
|
|
372
|
+
|
|
373
|
+
expectType<typeof value, string | boolean>('<=');
|
|
374
|
+
|
|
375
|
+
assert.isTrue(typeof value === 'string' || typeof value === 'boolean');
|
|
362
376
|
});
|
|
363
377
|
});
|
|
364
378
|
|
|
@@ -392,11 +406,13 @@ describe(isNotBigint, () => {
|
|
|
392
406
|
test('should act as a type guard', () => {
|
|
393
407
|
const value: number | bigint = 123;
|
|
394
408
|
|
|
395
|
-
if (isNotBigint(value)) {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
expectTypeOf(value).toBeNumber();
|
|
409
|
+
if (!isNotBigint(value)) {
|
|
410
|
+
return;
|
|
399
411
|
}
|
|
412
|
+
|
|
413
|
+
expectType<typeof value, number>('<=');
|
|
414
|
+
|
|
415
|
+
expectTypeOf(value).toBeNumber();
|
|
400
416
|
});
|
|
401
417
|
});
|
|
402
418
|
|
|
@@ -434,11 +450,13 @@ describe(isNotString, () => {
|
|
|
434
450
|
test('should act as a type guard', () => {
|
|
435
451
|
const value: string | number | boolean = 42;
|
|
436
452
|
|
|
437
|
-
if (isNotString(value)) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
assert.isTrue(typeof value === 'number' || typeof value === 'boolean');
|
|
453
|
+
if (!isNotString(value)) {
|
|
454
|
+
return;
|
|
441
455
|
}
|
|
456
|
+
|
|
457
|
+
expectType<typeof value, number | boolean>('<=');
|
|
458
|
+
|
|
459
|
+
assert.isTrue(typeof value === 'number' || typeof value === 'boolean');
|
|
442
460
|
});
|
|
443
461
|
});
|
|
444
462
|
|
|
@@ -474,11 +492,13 @@ describe(isNotSymbol, () => {
|
|
|
474
492
|
test('should act as a type guard', () => {
|
|
475
493
|
const value: string | number | symbol = 'test';
|
|
476
494
|
|
|
477
|
-
if (isNotSymbol(value)) {
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
assert.isTrue(typeof value === 'string' || typeof value === 'number');
|
|
495
|
+
if (!isNotSymbol(value)) {
|
|
496
|
+
return;
|
|
481
497
|
}
|
|
498
|
+
|
|
499
|
+
expectType<typeof value, string | number>('<=');
|
|
500
|
+
|
|
501
|
+
assert.isTrue(typeof value === 'string' || typeof value === 'number');
|
|
482
502
|
});
|
|
483
503
|
});
|
|
484
504
|
|
|
@@ -510,12 +530,14 @@ describe(isNullish, () => {
|
|
|
510
530
|
test('should act as a type guard', () => {
|
|
511
531
|
const value: string | null | undefined = null;
|
|
512
532
|
|
|
513
|
-
if (isNullish(value)) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
// Value is guaranteed to be null or undefined in this branch
|
|
517
|
-
expect(true).toBe(true);
|
|
533
|
+
if (!isNullish(value)) {
|
|
534
|
+
return;
|
|
518
535
|
}
|
|
536
|
+
|
|
537
|
+
expectType<typeof value, null | undefined>('<=');
|
|
538
|
+
|
|
539
|
+
// Value is guaranteed to be null or undefined in this branch
|
|
540
|
+
expect(true).toBe(true);
|
|
519
541
|
});
|
|
520
542
|
|
|
521
543
|
test('should handle edge cases', () => {
|
|
@@ -558,11 +580,13 @@ describe(isNonNullish, () => {
|
|
|
558
580
|
test('should act as a type guard', () => {
|
|
559
581
|
const value: string | null | undefined = 'test';
|
|
560
582
|
|
|
561
|
-
if (isNonNullish(value)) {
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
expect(value).toHaveLength(4);
|
|
583
|
+
if (!isNonNullish(value)) {
|
|
584
|
+
return;
|
|
565
585
|
}
|
|
586
|
+
|
|
587
|
+
expectType<typeof value, string>('<=');
|
|
588
|
+
|
|
589
|
+
expect(value).toHaveLength(4);
|
|
566
590
|
});
|
|
567
591
|
|
|
568
592
|
test('should work with array filtering', () => {
|
|
@@ -588,12 +612,14 @@ describe(isNonNullish, () => {
|
|
|
588
612
|
|
|
589
613
|
const value: ComplexType = 42;
|
|
590
614
|
|
|
591
|
-
if (isNonNullish(value)) {
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
// Value is guaranteed to be non-nullish in this branch
|
|
595
|
-
expect(true).toBe(true);
|
|
615
|
+
if (!isNonNullish(value)) {
|
|
616
|
+
return;
|
|
596
617
|
}
|
|
618
|
+
|
|
619
|
+
expectType<typeof value, string | number | boolean>('<=');
|
|
620
|
+
|
|
621
|
+
// Value is guaranteed to be non-nullish in this branch
|
|
622
|
+
expect(true).toBe(true);
|
|
597
623
|
});
|
|
598
624
|
});
|
|
599
625
|
|
|
@@ -601,11 +627,13 @@ describe('type guard behavior in complex scenarios', () => {
|
|
|
601
627
|
test('should work with nested conditions', () => {
|
|
602
628
|
const value: string | number | boolean | null | undefined = 'test';
|
|
603
629
|
|
|
604
|
-
if (isNonNullish(value) && isNotBoolean(value) && isNotNumber(value)) {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
expectTypeOf(value).toBeString();
|
|
630
|
+
if (!(isNonNullish(value) && isNotBoolean(value) && isNotNumber(value))) {
|
|
631
|
+
return;
|
|
608
632
|
}
|
|
633
|
+
|
|
634
|
+
expectType<typeof value, string>('<=');
|
|
635
|
+
|
|
636
|
+
expectTypeOf(value).toBeString();
|
|
609
637
|
});
|
|
610
638
|
|
|
611
639
|
test('should work with array operations', () => {
|
package/src/iterator/range.mts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type NonZeroSafeInt,
|
|
3
|
-
type PositiveSafeInt,
|
|
4
|
-
type SafeUint,
|
|
5
|
-
type WithSmallInt,
|
|
6
|
-
} from 'ts-type-forge';
|
|
1
|
+
import type { NonZeroSafeInt, SafeUint, WithSmallInt } from 'ts-type-forge';
|
|
7
2
|
import { SafeInt, asSafeInt } from '../number/index.mjs';
|
|
8
3
|
|
|
9
4
|
/**
|
|
@@ -18,8 +13,9 @@ import { SafeInt, asSafeInt } from '../number/index.mjs';
|
|
|
18
13
|
*
|
|
19
14
|
* The function has two overloaded signatures:
|
|
20
15
|
*
|
|
21
|
-
* 1. For non-negative ranges: accepts SafeUint parameters and optional
|
|
22
|
-
* step
|
|
16
|
+
* 1. For non-negative ranges: accepts SafeUint parameters and an optional
|
|
17
|
+
* non-zero step. Every value lies between `start` and `end`, so a negative
|
|
18
|
+
* step still yields only non-negative numbers
|
|
23
19
|
* 2. For general ranges: accepts SafeInt parameters and optional non-zero step
|
|
24
20
|
*
|
|
25
21
|
* **Generator Behavior:**
|
|
@@ -75,7 +71,7 @@ export function range(
|
|
|
75
71
|
start: WithSmallInt<SafeUint, MaxInt>,
|
|
76
72
|
end: WithSmallInt<SafeUint, MaxInt>,
|
|
77
73
|
// eslint-disable-next-line @typescript-eslint/unified-signatures
|
|
78
|
-
step?: WithSmallInt<
|
|
74
|
+
step?: WithSmallInt<NonZeroSafeInt, MaxInt>,
|
|
79
75
|
): Generator<SafeUint, void, unknown>;
|
|
80
76
|
|
|
81
77
|
export function range(
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { SafeInt, SafeUint } from 'ts-type-forge';
|
|
2
|
+
import { expectType } from '../expect-type.mjs';
|
|
3
|
+
import { asNonZeroSafeInt, asSafeUint } from '../number/index.mjs';
|
|
1
4
|
import { range } from './range.mjs';
|
|
2
5
|
|
|
3
6
|
describe(range, () => {
|
|
@@ -49,4 +52,30 @@ describe(range, () => {
|
|
|
49
52
|
test('range(1, 12, 2)', () => {
|
|
50
53
|
assert.deepStrictEqual(Array.from(range(1, 12, 2)), [1, 3, 5, 7, 9, 11]);
|
|
51
54
|
});
|
|
55
|
+
|
|
56
|
+
// A negative step from non-negative bounds only counts down to `end`, so
|
|
57
|
+
// every value stays non-negative.
|
|
58
|
+
test('a negative step from non-negative bounds yields SafeUint', () => {
|
|
59
|
+
const xs = Array.from(range(asSafeUint(3), asSafeUint(0), -1));
|
|
60
|
+
|
|
61
|
+
expectType<(typeof xs)[number], SafeUint>('=');
|
|
62
|
+
|
|
63
|
+
assert.deepStrictEqual(xs, [3, 2, 1]);
|
|
64
|
+
|
|
65
|
+
const ys = Array.from(
|
|
66
|
+
range(asSafeUint(3), asSafeUint(0), asNonZeroSafeInt(-2)),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expectType<(typeof ys)[number], SafeUint>('=');
|
|
70
|
+
|
|
71
|
+
assert.deepStrictEqual(ys, [3, 1]);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('a negative bound still yields SafeInt', () => {
|
|
75
|
+
const xs = Array.from(range(0, -2, -1));
|
|
76
|
+
|
|
77
|
+
expectType<(typeof xs)[number], SafeInt>('=');
|
|
78
|
+
|
|
79
|
+
assert.deepStrictEqual(xs, [0, -1]);
|
|
80
|
+
});
|
|
52
81
|
});
|