ts-data-forge 14.7.1 → 14.9.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 +22 -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/functional/index.d.mts +2 -2
- package/dist/functional/index.d.mts.map +1 -1
- package/dist/functional/index.mjs +1 -1
- package/dist/functional/index.mjs.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 +32 -31
- 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/functional/index.mts +5 -0
- 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/debounce-function.test.mts +3 -0
- 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,15 +1,15 @@
|
|
|
1
1
|
import { isError } from '@sindresorhus/is';
|
|
2
|
-
import {
|
|
2
|
+
import type { Int, NonEmptyTuple, Uint } from 'ts-type-forge';
|
|
3
3
|
import { IMap } from '../../collections/index.mjs';
|
|
4
4
|
import { Optional, Result } from '../../functional/index.mjs';
|
|
5
5
|
import { isString, isUndefined } from '../../guard/index.mjs';
|
|
6
6
|
import { asUint32, Num, Uint32 } from '../../number/index.mjs';
|
|
7
7
|
import { unknownToString } from '../../others/index.mjs';
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
import type {
|
|
9
|
+
ArrayIndex,
|
|
10
|
+
MapSetKeyType,
|
|
11
|
+
SizeType,
|
|
12
|
+
Some,
|
|
13
13
|
} from '../../types.mjs';
|
|
14
14
|
import { isNonEmpty } from './array-utils-length-bounded-array-guard.mjs';
|
|
15
15
|
|
|
@@ -605,11 +605,9 @@ export function join(
|
|
|
605
605
|
case 1: {
|
|
606
606
|
const [arg] = args;
|
|
607
607
|
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
return joinImpl(arg, undefined);
|
|
608
|
+
return isString(arg) || isUndefined(arg)
|
|
609
|
+
? (array) => joinImpl(array, arg)
|
|
610
|
+
: joinImpl(arg, undefined);
|
|
613
611
|
}
|
|
614
612
|
|
|
615
613
|
case 2: {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Uint32 } from 'ts-type-forge';
|
|
2
2
|
import { IMap } from '../../collections/index.mjs';
|
|
3
3
|
import { expectType } from '../../expect-type.mjs';
|
|
4
4
|
import { Optional, Result } from '../../functional/index.mjs';
|
|
5
|
-
import {
|
|
5
|
+
import type { Some } from '../../types.mjs';
|
|
6
6
|
import {
|
|
7
7
|
count,
|
|
8
8
|
countBy,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { expectType } from '../../expect-type.mjs';
|
|
2
2
|
import { Optional, pipe } from '../../functional/index.mjs';
|
|
3
3
|
import { asUint32 } from '../../number/index.mjs';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import type {
|
|
5
|
+
ArgArrayIndexWithNegative,
|
|
6
|
+
ArrayIndex,
|
|
7
|
+
SizeType,
|
|
8
8
|
} from '../../types.mjs';
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { expectType } from '../../expect-type.mjs';
|
|
2
2
|
import { Optional } from '../../functional/index.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import type { SizeType } from '../../types.mjs';
|
|
4
4
|
import {
|
|
5
5
|
find,
|
|
6
6
|
findIndex,
|
|
@@ -293,11 +293,13 @@ describe('Arr search operations', () => {
|
|
|
293
293
|
|
|
294
294
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
295
295
|
|
|
296
|
-
if (result
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
expect(result).toBe(1);
|
|
296
|
+
if (result === -1) {
|
|
297
|
+
return;
|
|
300
298
|
}
|
|
299
|
+
|
|
300
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
301
|
+
|
|
302
|
+
expect(result).toBe(1);
|
|
301
303
|
});
|
|
302
304
|
|
|
303
305
|
test('should return -1 for non-existent element', () => {
|
|
@@ -317,11 +319,13 @@ describe('Arr search operations', () => {
|
|
|
317
319
|
|
|
318
320
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
319
321
|
|
|
320
|
-
if (result
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
expect(result).toBe(3);
|
|
322
|
+
if (result === -1) {
|
|
323
|
+
return;
|
|
324
324
|
}
|
|
325
|
+
|
|
326
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
327
|
+
|
|
328
|
+
expect(result).toBe(3);
|
|
325
329
|
});
|
|
326
330
|
|
|
327
331
|
test('should return -1 when element not found from index', () => {
|
|
@@ -365,11 +369,13 @@ describe('Arr search operations', () => {
|
|
|
365
369
|
|
|
366
370
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
367
371
|
|
|
368
|
-
if (result
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
expect(result).toBe(3);
|
|
372
|
+
if (result === -1) {
|
|
373
|
+
return;
|
|
372
374
|
}
|
|
375
|
+
|
|
376
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
377
|
+
|
|
378
|
+
expect(result).toBe(3);
|
|
373
379
|
});
|
|
374
380
|
|
|
375
381
|
test('should return -1 for non-existent element', () => {
|
|
@@ -389,11 +395,13 @@ describe('Arr search operations', () => {
|
|
|
389
395
|
|
|
390
396
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
391
397
|
|
|
392
|
-
if (result
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
expect(result).toBe(1);
|
|
398
|
+
if (result === -1) {
|
|
399
|
+
return;
|
|
396
400
|
}
|
|
401
|
+
|
|
402
|
+
expectType<typeof result, SizeType.Arr>('=');
|
|
403
|
+
|
|
404
|
+
expect(result).toBe(1);
|
|
397
405
|
});
|
|
398
406
|
|
|
399
407
|
test('should return -1 when element not found before index', () => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import type {
|
|
2
|
+
BoundedLengthArray,
|
|
3
|
+
FixedLengthArray,
|
|
4
|
+
FixedLengthTuple,
|
|
5
|
+
MaxLengthArray,
|
|
6
|
+
MaxLengthOf,
|
|
7
|
+
MinLengthArray,
|
|
8
|
+
MinLengthOf,
|
|
9
9
|
} from 'ts-type-forge';
|
|
10
10
|
import { expectType } from '../../expect-type.mjs';
|
|
11
11
|
import {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type {
|
|
2
|
+
IntersectBrand,
|
|
3
|
+
NonEmptyTuple,
|
|
4
|
+
PositiveNumber,
|
|
5
5
|
} from 'ts-type-forge';
|
|
6
6
|
/**
|
|
7
7
|
* Returns the size (length) of an array.
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
* assert.isTrue(sizeOfLetters === 0);
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
25
|
-
import {
|
|
25
|
+
import type { SizeType } from '../../types.mjs';
|
|
26
26
|
|
|
27
27
|
export const size = <const Ar extends readonly unknown[]>(
|
|
28
28
|
array: Ar,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { FixedLengthTuple } from 'ts-type-forge';
|
|
2
2
|
import { Num } from '../../number/index.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import type { ArgArrayIndexWithNegative, SizeType } from '../../types.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Slices an array with automatically clamped start and end indices.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import type {
|
|
2
|
+
ConstrainedList,
|
|
3
|
+
HasLengthConstraint,
|
|
4
|
+
List,
|
|
5
|
+
NonEmptyArray,
|
|
6
|
+
NonEmptyTuple,
|
|
7
|
+
StructuralPrefixLength,
|
|
8
8
|
} from 'ts-type-forge';
|
|
9
9
|
import { Uint32 } from '../../number/index.mjs';
|
|
10
|
-
import {
|
|
10
|
+
import type { SizeType } from '../../types.mjs';
|
|
11
11
|
import { isEmpty } from './array-utils-length-bounded-array-guard.mjs';
|
|
12
12
|
import { size } from './array-utils-size.mjs';
|
|
13
13
|
import { sliceClamped } from './array-utils-slice-clamped.mjs';
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import type {
|
|
2
|
+
BoundedLengthArray,
|
|
3
|
+
ChangeArrayElement,
|
|
4
|
+
ConstrainedList,
|
|
5
|
+
FixedLengthTuple,
|
|
6
|
+
HasLengthConstraint,
|
|
7
|
+
IsFixedLengthList,
|
|
8
|
+
NonEmptyArray,
|
|
9
|
+
NonEmptyTuple,
|
|
10
|
+
PositiveInt,
|
|
11
|
+
PositiveUint32,
|
|
12
|
+
Primitive,
|
|
13
|
+
SafeUintWithSmallInt,
|
|
14
|
+
SupportedLength,
|
|
15
|
+
UnknownBrand,
|
|
16
|
+
WithSmallInt,
|
|
17
17
|
} from 'ts-type-forge';
|
|
18
18
|
import { IMap } from '../../collections/index.mjs';
|
|
19
19
|
import { expectType } from '../../expect-type.mjs';
|
|
20
20
|
import { asPositiveUint32, asUint32, Uint32 } from '../../number/index.mjs';
|
|
21
21
|
import { castMutable, tp } from '../../others/index.mjs';
|
|
22
|
-
import {
|
|
23
|
-
type ArrayIndex,
|
|
24
|
-
type MapSetKeyType,
|
|
25
|
-
type SizeType,
|
|
26
|
-
} from '../../types.mjs';
|
|
22
|
+
import type { ArrayIndex, MapSetKeyType, SizeType } from '../../types.mjs';
|
|
27
23
|
import { newArray, seq } from './array-utils-creation.mjs';
|
|
28
24
|
import { isNonEmpty } from './array-utils-length-bounded-array-guard.mjs';
|
|
29
25
|
import { size } from './array-utils-size.mjs';
|
|
@@ -548,7 +544,9 @@ export const uniqBy = <
|
|
|
548
544
|
return array.filter((val) => {
|
|
549
545
|
const mappedValue = mapFn(val);
|
|
550
546
|
|
|
551
|
-
if (mut_mappedValues.has(mappedValue))
|
|
547
|
+
if (mut_mappedValues.has(mappedValue)) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
552
550
|
|
|
553
551
|
mut_mappedValues.add(mappedValue);
|
|
554
552
|
|
|
@@ -972,12 +970,16 @@ export const zip = <
|
|
|
972
970
|
export const cartesianProduct = <T,>(
|
|
973
971
|
arrays: readonly (readonly T[])[],
|
|
974
972
|
): readonly (readonly T[])[] => {
|
|
975
|
-
if (!isNonEmpty(arrays))
|
|
973
|
+
if (!isNonEmpty(arrays)) {
|
|
974
|
+
return [[]];
|
|
975
|
+
}
|
|
976
976
|
|
|
977
977
|
const [first, ...rest] = arrays;
|
|
978
978
|
|
|
979
979
|
// If first array is empty, the result is empty
|
|
980
|
-
if (!isNonEmpty(first))
|
|
980
|
+
if (!isNonEmpty(first)) {
|
|
981
|
+
return [];
|
|
982
|
+
}
|
|
981
983
|
|
|
982
984
|
const restProduct = cartesianProduct(rest);
|
|
983
985
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type {
|
|
2
|
+
BoundedLengthArray,
|
|
3
|
+
FixedLengthTuple,
|
|
4
|
+
MinLengthArray,
|
|
5
|
+
NonEmptyArray,
|
|
6
|
+
NonEmptyTuple,
|
|
7
7
|
} from 'ts-type-forge';
|
|
8
8
|
import { IMap } from '../../collections/index.mjs';
|
|
9
9
|
import { expectType } from '../../expect-type.mjs';
|
|
@@ -963,11 +963,13 @@ describe('Arr transformations', () => {
|
|
|
963
963
|
expect(fruits.value[1]?.name).toBe('banana');
|
|
964
964
|
}
|
|
965
965
|
|
|
966
|
-
if (Optional.isSome(vegetables)) {
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
expect(vegetables.value[0]?.name).toBe('carrot');
|
|
966
|
+
if (!Optional.isSome(vegetables)) {
|
|
967
|
+
return;
|
|
970
968
|
}
|
|
969
|
+
|
|
970
|
+
expect(vegetables.value).toHaveLength(1);
|
|
971
|
+
|
|
972
|
+
expect(vegetables.value[0]?.name).toBe('carrot');
|
|
971
973
|
});
|
|
972
974
|
|
|
973
975
|
test('should work with numeric keys', () => {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type {
|
|
2
|
+
BoolOr,
|
|
3
|
+
ChangeArrayElement,
|
|
4
|
+
IsAny,
|
|
5
|
+
IsUnknown,
|
|
6
|
+
UnknownBrand,
|
|
7
7
|
} from 'ts-type-forge';
|
|
8
8
|
import { asUint32, Num } from '../../number/index.mjs';
|
|
9
|
-
import {
|
|
9
|
+
import type { ArrayIndex, SizeType } from '../../types.mjs';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Type guard that checks if a value is an array.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type {
|
|
2
|
+
BoundedLengthArray,
|
|
3
|
+
FixedLengthArray,
|
|
4
|
+
FixedLengthTuple,
|
|
5
|
+
MinLengthArray,
|
|
6
|
+
ReadonlyRecord,
|
|
7
7
|
} from 'ts-type-forge';
|
|
8
8
|
import { expectType } from '../../expect-type.mjs';
|
|
9
9
|
import {
|
|
@@ -66,22 +66,26 @@ describe('Arr validations', () => {
|
|
|
66
66
|
test('should work with readonly arrays', () => {
|
|
67
67
|
const readonlyArray: readonly number[] = [1, 2, 3] as const;
|
|
68
68
|
|
|
69
|
-
if (isArray(readonlyArray)) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(readonlyArray).toHaveLength(3);
|
|
69
|
+
if (!isArray(readonlyArray)) {
|
|
70
|
+
return;
|
|
73
71
|
}
|
|
72
|
+
|
|
73
|
+
expectType<typeof readonlyArray, readonly number[]>('=');
|
|
74
|
+
|
|
75
|
+
expect(readonlyArray).toHaveLength(3);
|
|
74
76
|
});
|
|
75
77
|
|
|
76
78
|
test('should work with mutable arrays', () => {
|
|
77
79
|
// transformer-ignore-next-line convert-to-readonly, append-as-const
|
|
78
80
|
const mutableArray: number[] = [1, 2, 3];
|
|
79
81
|
|
|
80
|
-
if (isArray(mutableArray)) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
expect(mutableArray).toHaveLength(3);
|
|
82
|
+
if (!isArray(mutableArray)) {
|
|
83
|
+
return;
|
|
84
84
|
}
|
|
85
|
+
|
|
86
|
+
expectType<typeof mutableArray, number[]>('=');
|
|
87
|
+
|
|
88
|
+
expect(mutableArray).toHaveLength(3);
|
|
85
89
|
});
|
|
86
90
|
|
|
87
91
|
test('should exclude impossible array types from unions', () => {
|
|
@@ -170,11 +174,13 @@ describe('Arr validations', () => {
|
|
|
170
174
|
test('should work as type guard (additional)', () => {
|
|
171
175
|
const value: unknown = [1, 2, 3] as const;
|
|
172
176
|
|
|
173
|
-
if (isArray(value)) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
expect(value).toHaveLength(3);
|
|
177
|
+
if (!isArray(value)) {
|
|
178
|
+
return;
|
|
177
179
|
}
|
|
180
|
+
|
|
181
|
+
expectType<typeof value, readonly unknown[]>('=');
|
|
182
|
+
|
|
183
|
+
expect(value).toHaveLength(3);
|
|
178
184
|
});
|
|
179
185
|
|
|
180
186
|
test('should handle array-like objects', () => {
|
|
@@ -238,14 +244,9 @@ describe('Arr validations', () => {
|
|
|
238
244
|
});
|
|
239
245
|
|
|
240
246
|
test('should work with generic function', () => {
|
|
241
|
-
const processGeneric = <T,>(value: T | readonly number[]): number =>
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
return value.length;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return 0;
|
|
248
|
-
};
|
|
247
|
+
const processGeneric = <T,>(value: T | readonly number[]): number =>
|
|
248
|
+
// Type is narrowed to array type within the first branch
|
|
249
|
+
isArray(value) ? value.length : 0;
|
|
249
250
|
|
|
250
251
|
expect(processGeneric([1, 2, 3])).toBe(3);
|
|
251
252
|
|
|
@@ -264,15 +265,12 @@ describe('Arr validations', () => {
|
|
|
264
265
|
test('should work with conditional types', () => {
|
|
265
266
|
type ArrayOrValue<T> = T extends readonly unknown[] ? T : readonly T[];
|
|
266
267
|
|
|
267
|
-
const makeArray = <T,>(value: T): ArrayOrValue<T> =>
|
|
268
|
-
|
|
269
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
274
|
-
return [value] as ArrayOrValue<T>;
|
|
275
|
-
};
|
|
268
|
+
const makeArray = <T,>(value: T): ArrayOrValue<T> =>
|
|
269
|
+
isArray(value)
|
|
270
|
+
? // eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
271
|
+
(value as ArrayOrValue<T>)
|
|
272
|
+
: // eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
273
|
+
([value] as ArrayOrValue<T>);
|
|
276
274
|
|
|
277
275
|
assert.deepStrictEqual(makeArray([1, 2, 3]), [1, 2, 3]);
|
|
278
276
|
|
|
@@ -284,11 +282,13 @@ describe('Arr validations', () => {
|
|
|
284
282
|
|
|
285
283
|
const tagged = Object.assign([1, 2, 3], { tag: 'test' }) as TaggedArray;
|
|
286
284
|
|
|
287
|
-
if (isArray(tagged)) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
expect(tagged.tag).toBe('test');
|
|
285
|
+
if (!isArray(tagged)) {
|
|
286
|
+
return;
|
|
291
287
|
}
|
|
288
|
+
|
|
289
|
+
expectType<typeof tagged, TaggedArray>('=');
|
|
290
|
+
|
|
291
|
+
expect(tagged.tag).toBe('test');
|
|
292
292
|
});
|
|
293
293
|
|
|
294
294
|
test('should work with branded types', () => {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prefer-iterator-to-array-at-end */
|
|
2
|
-
import {
|
|
2
|
+
import type { WidenLiteral } from 'ts-type-forge';
|
|
3
3
|
import { Optional, pipe } from '../functional/index.mjs';
|
|
4
4
|
import { asUint32 } from '../number/index.mjs';
|
|
5
5
|
import { tp, unknownToString } from '../others/index.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import type { MapSetKeyType, SizeType } from '../types.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Interface for an immutable map with custom key mapping and lookup operations.
|
|
@@ -1014,10 +1014,10 @@ class IMapMappedClass<K, V, KM extends MapSetKeyType>
|
|
|
1014
1014
|
|
|
1015
1015
|
/** @inheritdoc */
|
|
1016
1016
|
get(key: K | (WidenLiteral<K> & {})): Optional<V> {
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1017
|
+
return this.has(key)
|
|
1018
|
+
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, total-functions/no-unsafe-type-assertion
|
|
1019
|
+
Optional.some(this.#map.get(this.#toKey(key as K))!)
|
|
1020
|
+
: Optional.none;
|
|
1021
1021
|
}
|
|
1022
1022
|
|
|
1023
1023
|
/** @inheritdoc */
|
|
@@ -1031,7 +1031,9 @@ class IMapMappedClass<K, V, KM extends MapSetKeyType>
|
|
|
1031
1031
|
/** @inheritdoc */
|
|
1032
1032
|
every(predicate: (value: V, key: K) => boolean): boolean {
|
|
1033
1033
|
for (const [k, v] of this.entries()) {
|
|
1034
|
-
if (!predicate(v, k))
|
|
1034
|
+
if (!predicate(v, k)) {
|
|
1035
|
+
return false;
|
|
1036
|
+
}
|
|
1035
1037
|
}
|
|
1036
1038
|
|
|
1037
1039
|
return true;
|
|
@@ -1040,7 +1042,9 @@ class IMapMappedClass<K, V, KM extends MapSetKeyType>
|
|
|
1040
1042
|
/** @inheritdoc */
|
|
1041
1043
|
some(predicate: (value: V, key: K) => boolean): boolean {
|
|
1042
1044
|
for (const [k, v] of this.entries()) {
|
|
1043
|
-
if (predicate(v, k))
|
|
1045
|
+
if (predicate(v, k)) {
|
|
1046
|
+
return true;
|
|
1047
|
+
}
|
|
1044
1048
|
}
|
|
1045
1049
|
|
|
1046
1050
|
return false;
|
|
@@ -1073,7 +1077,9 @@ class IMapMappedClass<K, V, KM extends MapSetKeyType>
|
|
|
1073
1077
|
set(key: K, value: V): IMapMapped<K, V, KM> {
|
|
1074
1078
|
const curr = this.get(key);
|
|
1075
1079
|
|
|
1076
|
-
if (Optional.isSome(curr) && value === curr.value)
|
|
1080
|
+
if (Optional.isSome(curr) && value === curr.value) {
|
|
1081
|
+
return this;
|
|
1082
|
+
}
|
|
1077
1083
|
|
|
1078
1084
|
const keyMapped = this.#toKey(key);
|
|
1079
1085
|
|
package/src/collections/imap.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prefer-iterator-to-array-at-end */
|
|
2
|
-
import {
|
|
2
|
+
import type { WidenLiteral } from 'ts-type-forge';
|
|
3
3
|
import { Optional, pipe } from '../functional/index.mjs';
|
|
4
4
|
import { asUint32 } from '../number/index.mjs';
|
|
5
5
|
import { tp, unknownToString } from '../others/index.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import type { MapSetKeyType, SizeType } from '../types.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Interface for an immutable map with lookup operations and functional
|
|
@@ -759,10 +759,10 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
759
759
|
|
|
760
760
|
/** @inheritdoc */
|
|
761
761
|
get(key: K | (WidenLiteral<K> & {})): Optional<V> {
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
762
|
+
return this.has(key)
|
|
763
|
+
? // eslint-disable-next-line total-functions/no-unsafe-type-assertion, @typescript-eslint/no-non-null-assertion
|
|
764
|
+
Optional.some(this.#map.get(key as K)!)
|
|
765
|
+
: Optional.none;
|
|
766
766
|
}
|
|
767
767
|
|
|
768
768
|
/** @inheritdoc */
|
|
@@ -776,7 +776,9 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
776
776
|
/** @inheritdoc */
|
|
777
777
|
every(predicate: (value: V, key: K) => boolean): boolean {
|
|
778
778
|
for (const [k, v] of this.entries()) {
|
|
779
|
-
if (!predicate(v, k))
|
|
779
|
+
if (!predicate(v, k)) {
|
|
780
|
+
return false;
|
|
781
|
+
}
|
|
780
782
|
}
|
|
781
783
|
|
|
782
784
|
return true;
|
|
@@ -785,7 +787,9 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
785
787
|
/** @inheritdoc */
|
|
786
788
|
some(predicate: (value: V, key: K) => boolean): boolean {
|
|
787
789
|
for (const [k, v] of this.entries()) {
|
|
788
|
-
if (predicate(v, k))
|
|
790
|
+
if (predicate(v, k)) {
|
|
791
|
+
return true;
|
|
792
|
+
}
|
|
789
793
|
}
|
|
790
794
|
|
|
791
795
|
return false;
|
|
@@ -812,7 +816,9 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
812
816
|
set(key: K, value: V): IMap<K, V> {
|
|
813
817
|
const curr = this.get(key);
|
|
814
818
|
|
|
815
|
-
if (Optional.isSome(curr) && value === curr.value)
|
|
819
|
+
if (Optional.isSome(curr) && value === curr.value) {
|
|
820
|
+
return this; // has no changes
|
|
821
|
+
}
|
|
816
822
|
|
|
817
823
|
if (!this.has(key)) {
|
|
818
824
|
return IMap.create([...this.#map, tp(key, value)]);
|
|
@@ -656,12 +656,14 @@ describe('IMap.every', () => {
|
|
|
656
656
|
['b', 'world'],
|
|
657
657
|
]);
|
|
658
658
|
|
|
659
|
-
if (map.every((value): value is string => typeof value === 'string')) {
|
|
660
|
-
|
|
661
|
-
const firstValue = Optional.unwrap(map.get('a'));
|
|
662
|
-
|
|
663
|
-
assert.isTrue(isString(firstValue));
|
|
659
|
+
if (!map.every((value): value is string => typeof value === 'string')) {
|
|
660
|
+
return;
|
|
664
661
|
}
|
|
662
|
+
|
|
663
|
+
// Type should be narrowed to IMap<string, string>
|
|
664
|
+
const firstValue = Optional.unwrap(map.get('a'));
|
|
665
|
+
|
|
666
|
+
assert.isTrue(isString(firstValue));
|
|
665
667
|
});
|
|
666
668
|
});
|
|
667
669
|
|