ts-data-forge 14.6.2 → 14.6.4

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.
Files changed (182) hide show
  1. package/dist/array/impl/array-utils-creation.mjs +103 -103
  2. package/dist/array/impl/array-utils-element-access.mjs +46 -46
  3. package/dist/array/impl/array-utils-iterators.mjs +54 -54
  4. package/dist/array/impl/array-utils-length-bounded-array-cast.mjs +49 -49
  5. package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +40 -40
  6. package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs +42 -42
  7. package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +46 -46
  8. package/dist/array/impl/array-utils-modification.mjs +5 -5
  9. package/dist/array/impl/array-utils-reducing-value.mjs +11 -11
  10. package/dist/array/impl/array-utils-search.mjs +6 -6
  11. package/dist/array/impl/array-utils-set-op.mjs +116 -116
  12. package/dist/array/impl/array-utils-size.mjs +6 -6
  13. package/dist/array/impl/array-utils-slice-clamped.mjs +1 -1
  14. package/dist/array/impl/array-utils-slicing.mjs +56 -56
  15. package/dist/array/impl/array-utils-transformation.mjs +158 -158
  16. package/dist/array/impl/array-utils-validation.mjs +36 -36
  17. package/dist/collections/imap-mapped.mjs +195 -195
  18. package/dist/collections/imap.mjs +143 -143
  19. package/dist/collections/iset-mapped.mjs +320 -320
  20. package/dist/collections/iset.mjs +207 -207
  21. package/dist/collections/queue.mjs +130 -130
  22. package/dist/collections/stack.mjs +125 -125
  23. package/dist/expect-type.mjs +68 -68
  24. package/dist/functional/async-result/impl/async-result-flat-map.mjs +3 -3
  25. package/dist/functional/async-result/impl/async-result-map-err.mjs +2 -2
  26. package/dist/functional/async-result/impl/async-result-map.mjs +2 -2
  27. package/dist/functional/async-result/impl/async-result-unwrap-or.mjs +31 -31
  28. package/dist/functional/optional/impl/optional-expect-to-be.mjs +1 -1
  29. package/dist/functional/optional/impl/optional-filter.mjs +1 -1
  30. package/dist/functional/optional/impl/optional-flat-map.mjs +1 -1
  31. package/dist/functional/optional/impl/optional-from-nullable.mjs +24 -24
  32. package/dist/functional/optional/impl/optional-is-none.mjs +19 -19
  33. package/dist/functional/optional/impl/optional-is-optional.mjs +18 -18
  34. package/dist/functional/optional/impl/optional-is-some.mjs +20 -20
  35. package/dist/functional/optional/impl/optional-map.mjs +2 -2
  36. package/dist/functional/optional/impl/optional-match.mjs +2 -2
  37. package/dist/functional/optional/impl/optional-none.mjs +16 -16
  38. package/dist/functional/optional/impl/optional-or-else.mjs +1 -1
  39. package/dist/functional/optional/impl/optional-some.mjs +19 -19
  40. package/dist/functional/optional/impl/optional-to-nullable.mjs +26 -26
  41. package/dist/functional/optional/impl/optional-unwrap-or.mjs +1 -1
  42. package/dist/functional/optional/impl/optional-unwrap-throw.mjs +28 -28
  43. package/dist/functional/optional/impl/optional-unwrap.mjs +1 -1
  44. package/dist/functional/optional/impl/optional-zip.mjs +32 -32
  45. package/dist/functional/optional/impl/tag.mjs +1 -1
  46. package/dist/functional/pipe.mjs +19 -19
  47. package/dist/functional/result/impl/result-err.mjs +25 -25
  48. package/dist/functional/result/impl/result-expect-to-be.mjs +2 -2
  49. package/dist/functional/result/impl/result-flat-map.mjs +4 -4
  50. package/dist/functional/result/impl/result-fold.mjs +4 -4
  51. package/dist/functional/result/impl/result-from-optional.mjs +2 -2
  52. package/dist/functional/result/impl/result-from-promise.mjs +34 -34
  53. package/dist/functional/result/impl/result-from-throwable.mjs +29 -29
  54. package/dist/functional/result/impl/result-is-err.mjs +19 -19
  55. package/dist/functional/result/impl/result-is-ok.mjs +19 -19
  56. package/dist/functional/result/impl/result-is-result.mjs +19 -19
  57. package/dist/functional/result/impl/result-map-err.mjs +4 -4
  58. package/dist/functional/result/impl/result-map.mjs +4 -4
  59. package/dist/functional/result/impl/result-match.mjs +3 -3
  60. package/dist/functional/result/impl/result-ok.mjs +25 -25
  61. package/dist/functional/result/impl/result-or-else.mjs +2 -2
  62. package/dist/functional/result/impl/result-safe-try.mjs +15 -15
  63. package/dist/functional/result/impl/result-safe-unwrap.mjs +33 -33
  64. package/dist/functional/result/impl/result-swap.mjs +20 -20
  65. package/dist/functional/result/impl/result-to-optional.mjs +27 -27
  66. package/dist/functional/result/impl/result-unwrap-err-or.mjs +2 -2
  67. package/dist/functional/result/impl/result-unwrap-err-throw.mjs +31 -31
  68. package/dist/functional/result/impl/result-unwrap-err.mjs +30 -30
  69. package/dist/functional/result/impl/result-unwrap-ok-or.mjs +2 -2
  70. package/dist/functional/result/impl/result-unwrap-ok.mjs +1 -1
  71. package/dist/functional/result/impl/result-unwrap-throw.mjs +31 -31
  72. package/dist/functional/result/impl/result-zip.mjs +29 -29
  73. package/dist/functional/result/impl/tag.mjs +1 -1
  74. package/dist/functional/ternary-result/impl/tag.mjs +2 -2
  75. package/dist/functional/ternary-result/impl/ternary-result-err.mjs +13 -13
  76. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs +4 -4
  77. package/dist/functional/ternary-result/impl/ternary-result-fold.mjs +4 -4
  78. package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs +18 -18
  79. package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs +17 -17
  80. package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs +17 -17
  81. package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs +19 -19
  82. package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs +19 -19
  83. package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs +18 -18
  84. package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs +2 -2
  85. package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs +3 -3
  86. package/dist/functional/ternary-result/impl/ternary-result-map.mjs +4 -4
  87. package/dist/functional/ternary-result/impl/ternary-result-ok.mjs +14 -14
  88. package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs +19 -19
  89. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs +19 -19
  90. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs +17 -17
  91. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs +1 -1
  92. package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs +20 -20
  93. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs +18 -18
  94. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs +17 -17
  95. package/dist/functional/ternary-result/impl/ternary-result-warn.mjs +16 -16
  96. package/dist/functional/ternary-result/impl/ternary-result-zip.mjs +31 -31
  97. package/dist/functional/ternary-result/impl/variant-name.mjs +1 -1
  98. package/dist/guard/has-key.mjs +41 -41
  99. package/dist/guard/is-non-empty-string.mjs +37 -37
  100. package/dist/guard/is-non-null-object.mjs +34 -34
  101. package/dist/guard/is-primitive.mjs +31 -31
  102. package/dist/guard/is-record.mjs +86 -86
  103. package/dist/guard/is-type.mjs +387 -387
  104. package/dist/guard/key-is-in.mjs +40 -40
  105. package/dist/iterator/range.mjs +1 -1
  106. package/dist/json/json.mjs +289 -289
  107. package/dist/number/branded-types/finite-number.mjs +116 -116
  108. package/dist/number/branded-types/int.mjs +223 -223
  109. package/dist/number/branded-types/int16.mjs +116 -116
  110. package/dist/number/branded-types/int32.mjs +116 -116
  111. package/dist/number/branded-types/negative-finite-number.mjs +126 -126
  112. package/dist/number/branded-types/negative-int.mjs +104 -104
  113. package/dist/number/branded-types/negative-safe-int.mjs +104 -104
  114. package/dist/number/branded-types/non-negative-finite-number.mjs +132 -132
  115. package/dist/number/branded-types/non-negative-int16.mjs +113 -113
  116. package/dist/number/branded-types/non-negative-int32.mjs +113 -113
  117. package/dist/number/branded-types/non-positive-finite-number.mjs +116 -116
  118. package/dist/number/branded-types/non-positive-int.mjs +97 -97
  119. package/dist/number/branded-types/non-positive-safe-int.mjs +98 -98
  120. package/dist/number/branded-types/non-zero-finite-number.mjs +112 -112
  121. package/dist/number/branded-types/non-zero-int.mjs +82 -82
  122. package/dist/number/branded-types/non-zero-int16.mjs +95 -95
  123. package/dist/number/branded-types/non-zero-int32.mjs +95 -95
  124. package/dist/number/branded-types/non-zero-safe-int.mjs +99 -99
  125. package/dist/number/branded-types/non-zero-uint16.mjs +95 -95
  126. package/dist/number/branded-types/non-zero-uint32.mjs +95 -95
  127. package/dist/number/branded-types/positive-finite-number.mjs +134 -134
  128. package/dist/number/branded-types/positive-int.mjs +237 -237
  129. package/dist/number/branded-types/positive-int16.mjs +110 -110
  130. package/dist/number/branded-types/positive-int32.mjs +110 -110
  131. package/dist/number/branded-types/positive-safe-int.mjs +268 -268
  132. package/dist/number/branded-types/positive-uint16.mjs +110 -110
  133. package/dist/number/branded-types/positive-uint32.mjs +110 -110
  134. package/dist/number/branded-types/safe-int.mjs +259 -259
  135. package/dist/number/branded-types/safe-uint.mjs +111 -111
  136. package/dist/number/branded-types/uint.mjs +225 -225
  137. package/dist/number/branded-types/uint16.mjs +108 -108
  138. package/dist/number/branded-types/uint32.mjs +108 -108
  139. package/dist/number/enum/int8.mjs +118 -118
  140. package/dist/number/enum/uint8.mjs +109 -109
  141. package/dist/number/num-arithmetic-types.mjs +1 -1
  142. package/dist/number/num.mjs +478 -478
  143. package/dist/number/refined-number-utils.mjs +170 -170
  144. package/dist/object/object.mjs +234 -234
  145. package/dist/others/cast-mutable.mjs +33 -33
  146. package/dist/others/cast-readonly.mjs +32 -32
  147. package/dist/others/debounce-function.mjs +13 -13
  148. package/dist/others/fast-deep-equal.mjs +14 -14
  149. package/dist/others/if-then.mjs +29 -29
  150. package/dist/others/tuple.mjs +50 -50
  151. package/dist/others/unknown-to-string.mjs +38 -38
  152. package/dist/promise/promise.mjs +47 -47
  153. package/dist/string/str.mjs +177 -177
  154. package/dist/types.mjs +1 -1
  155. package/package.json +6 -6
  156. package/src/guard/is-type.test.mts +2 -2
  157. package/src/number/branded-types/finite-number.test.mts +1 -1
  158. package/src/number/branded-types/int.test.mts +1 -1
  159. package/src/number/branded-types/int16.test.mts +1 -1
  160. package/src/number/branded-types/int32.test.mts +1 -1
  161. package/src/number/branded-types/non-negative-finite-number.test.mts +1 -1
  162. package/src/number/branded-types/non-negative-int16.test.mts +1 -1
  163. package/src/number/branded-types/non-negative-int32.test.mts +1 -1
  164. package/src/number/branded-types/non-zero-finite-number.test.mts +1 -1
  165. package/src/number/branded-types/non-zero-int.test.mts +1 -1
  166. package/src/number/branded-types/non-zero-int16.test.mts +1 -1
  167. package/src/number/branded-types/non-zero-int32.test.mts +1 -1
  168. package/src/number/branded-types/non-zero-safe-int.test.mts +1 -1
  169. package/src/number/branded-types/non-zero-uint16.test.mts +1 -1
  170. package/src/number/branded-types/non-zero-uint32.test.mts +1 -1
  171. package/src/number/branded-types/positive-finite-number.test.mts +1 -1
  172. package/src/number/branded-types/positive-int.test.mts +1 -1
  173. package/src/number/branded-types/positive-int16.test.mts +1 -1
  174. package/src/number/branded-types/positive-int32.test.mts +1 -1
  175. package/src/number/branded-types/positive-safe-int.test.mts +1 -1
  176. package/src/number/branded-types/positive-uint16.test.mts +1 -1
  177. package/src/number/branded-types/positive-uint32.test.mts +1 -1
  178. package/src/number/branded-types/safe-int.test.mts +1 -1
  179. package/src/number/branded-types/safe-uint.test.mts +1 -1
  180. package/src/number/branded-types/uint.test.mts +1 -1
  181. package/src/number/branded-types/uint16.test.mts +1 -1
  182. package/src/number/branded-types/uint32.test.mts +1 -1
@@ -2,55 +2,55 @@ import { Uint32 } from '../../number/index.mjs';
2
2
  import { isEmpty } from './array-utils-length-bounded-array-guard.mjs';
3
3
  import { size } from './array-utils-size.mjs';
4
4
  import { sliceClamped } from './array-utils-slice-clamped.mjs';
5
- /**
6
- * Returns all elements of an array except the first one.
7
- *
8
- * @example
9
- *
10
- * ```ts
11
- * {
12
- * const scientists = ['Ada', 'Grace', 'Katherine'] as const;
13
- *
14
- * const remainder = Arr.tail(scientists);
15
- *
16
- * assert.deepStrictEqual(remainder, ['Grace', 'Katherine']);
17
- *
18
- * assert.isTrue(remainder.length === 2);
19
- * }
20
- *
21
- * {
22
- * const values = [1, 2, 3] as const;
23
- *
24
- * const remainder = Arr.rest(values);
25
- *
26
- * const emptyRemainder = Arr.rest([1] as const);
27
- *
28
- * assert.deepStrictEqual(remainder, [2, 3] as const);
29
- *
30
- * assert.deepStrictEqual(emptyRemainder, [] as const);
31
- * }
32
- * ```
33
- */
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
34
  export const tail = (array) =>
35
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
35
+
36
36
  array.slice(1);
37
- /**
38
- * Returns all elements of an array except the last one.
39
- *
40
- * @example
41
- *
42
- * ```ts
43
- * const queue = ['task-1', 'task-2', 'task-3'] as const;
44
- *
45
- * const withoutLast = Arr.butLast(queue);
46
- *
47
- * assert.deepStrictEqual(withoutLast, ['task-1', 'task-2']);
48
- *
49
- * assert.isTrue(withoutLast.length === 2);
50
- * ```
51
- */
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
52
  export const butLast = (array) =>
53
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
53
+
54
54
  (isEmpty(array)
55
55
  ? []
56
56
  : array.slice(0, -1));
@@ -90,16 +90,16 @@ export function skipLast(...args) {
90
90
  }
91
91
  }
92
92
  const skipLastImpl = (array, num) => sliceClamped(array, 0, Uint32.sub(size(array), num));
93
- /**
94
- * Alias for `tail`.
95
- *
96
- * @see {@link tail}
97
- */
93
+
94
+
95
+
96
+
97
+
98
98
  export const rest = tail;
99
- /**
100
- * Alias for `skip`.
101
- *
102
- * @see {@link skip}
103
- */
99
+
100
+
101
+
102
+
103
+
104
104
  export const drop = skip;
105
105
  //# sourceMappingURL=array-utils-slicing.mjs.map
@@ -1,15 +1,15 @@
1
1
  import { IMap } from '../../collections/index.mjs';
2
2
 
3
- import { asUint32, Uint32 } from '../../number/index.mjs';
3
+ import { asPositiveUint32, asUint32, Uint32 } from '../../number/index.mjs';
4
4
  import { tp } from '../../others/index.mjs';
5
- import { seq } from './array-utils-creation.mjs';
5
+ import { newArray, seq } from './array-utils-creation.mjs';
6
6
  import { isNonEmpty } from './array-utils-length-bounded-array-guard.mjs';
7
7
  import { size } from './array-utils-size.mjs';
8
8
  export function map(...args) {
9
9
  switch (args.length) {
10
10
  case 2: {
11
11
  const [array, mapFn] = args;
12
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
12
+
13
13
  return array.map(mapFn);
14
14
  }
15
15
  case 1: {
@@ -35,38 +35,38 @@ const scanImpl = (array, reducer, init) => {
35
35
  }
36
36
  return mut_result;
37
37
  };
38
- /**
39
- * Reverses an array.
40
- *
41
- * @example
42
- *
43
- * ```ts
44
- * const tuple = [1, 'two', true] as const;
45
- *
46
- * const reversed = Arr.toReversed(tuple);
47
- *
48
- * const expected = [true, 'two', 1] as const;
49
- *
50
- * assert.deepStrictEqual(reversed, expected);
51
- * ```
52
- */
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
53
  export const toReversed = (array) =>
54
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
54
+
55
55
  array.toReversed();
56
56
  export function toSorted(array, comparator) {
57
57
  return array.toSorted(
58
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
58
+
59
59
  comparator ??
60
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
60
+
61
61
  ((x, y) => x - y));
62
62
  }
63
63
  export function toSortedBy(array, comparatorValueMapper, comparator) {
64
64
  return array.toSorted((x, y) => comparator === undefined
65
- ? // This branch assumes V is number if comparator is undefined.
66
- // The overloads should handle this, but explicit cast might be needed if V is not number.
67
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
65
+ ?
66
+
67
+
68
68
  comparatorValueMapper(x) -
69
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
69
+
70
70
  comparatorValueMapper(y)
71
71
  : comparator(comparatorValueMapper(x), comparatorValueMapper(y)));
72
72
  }
@@ -88,54 +88,54 @@ export function filterNot(...args) {
88
88
  }
89
89
  }
90
90
  const filterNotImpl = (array, predicate) => array.filter((a, i) => !predicate(a, asUint32(i)));
91
- /**
92
- * Creates a new array with unique elements.
93
- *
94
- * @example
95
- *
96
- * ```ts
97
- * const letters = ['a', 'b', 'a', 'c', 'b'] as const;
98
- *
99
- * const uniqueLetters = Arr.uniq(letters);
100
- *
101
- * const expected = ['a', 'b', 'c'] as const;
102
- *
103
- * assert.deepStrictEqual<readonly string[]>(uniqueLetters, expected);
104
- * ```
105
- */
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
106
  export const uniq = (array) =>
107
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
107
+
108
108
  Array.from(new Set(array));
109
- /**
110
- * Creates a new array with unique elements based on a mapped value.
111
- *
112
- * @example
113
- *
114
- * ```ts
115
- * const people = [
116
- * { id: 1, name: 'Ada' },
117
- * { id: 2, name: 'Brian' },
118
- * { id: 1, name: 'Alan' },
119
- * { id: 3, name: 'Grace' },
120
- * ] as const;
121
- *
122
- * const uniqueById = Arr.uniqBy(people, (person) => person.id);
123
- *
124
- * const expected = [
125
- * { id: 1, name: 'Ada' },
126
- * { id: 2, name: 'Brian' },
127
- * { id: 3, name: 'Grace' },
128
- * ] as const;
129
- *
130
- * assert.deepStrictEqual<readonly Readonly<{ id: number; name: string }>[]>(
131
- * uniqueById,
132
- * expected,
133
- * );
134
- * ```
135
- */
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
136
  export const uniqBy = (array, mapFn) => {
137
137
  const mut_mappedValues = new Set();
138
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
138
+
139
139
  return array.filter((val) => {
140
140
  const mappedValue = mapFn(val);
141
141
  if (mut_mappedValues.has(mappedValue))
@@ -187,54 +187,54 @@ export function partition(...args) {
187
187
  }
188
188
  const partitionImpl = (array, chunkSize) => chunkSize < 2
189
189
  ? []
190
- : // eslint-disable-next-line total-functions/no-partial-division
190
+ :
191
191
  seq(asUint32(Math.ceil(array.length / chunkSize))).map((i) => array.slice(chunkSize * i, chunkSize * (i + 1)));
192
- /**
193
- * Alias for `partition`.
194
- *
195
- * @see {@link partition}
196
- */
192
+
193
+
194
+
195
+
196
+
197
197
  export const chunk = partition;
198
- /**
199
- * Concatenates two arrays.
200
- *
201
- * The exact tuple shape is preserved. Additionally, when either input is known
202
- * to be non-empty (a non-empty tuple or a branded `NonEmptyArray`), the result
203
- * is branded as non-empty so it is assignable to `NonEmptyArray`.
204
- *
205
- * @example
206
- *
207
- * ```ts
208
- * const numbers = [1, 2] as const;
209
- *
210
- * const words = ['three', 'four'] as const;
211
- *
212
- * const combined = Arr.concat(numbers, words);
213
- *
214
- * // Because at least one input is non-empty, the result is assignable to
215
- * // NonEmptyArray.
216
- * const nonEmpty: NonEmptyArray<number | string> = combined;
217
- *
218
- * const expectedCombined = [1, 2, 'three', 'four'] as const;
219
- *
220
- * assert.deepStrictEqual<readonly (number | string)[]>(
221
- * combined,
222
- * expectedCombined,
223
- * );
224
- *
225
- * assert.isTrue(nonEmpty.length >= 1);
226
- * ```
227
- */
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
228
  export const concat = (array1, array2) =>
229
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
229
+
230
230
  [...array1, ...array2];
231
231
  export function groupBy(...args) {
232
232
  switch (args.length) {
233
233
  case 2: {
234
234
  const [array, grouper] = args;
235
- const mut_groups = new Map(); // Store mutable arrays internally
235
+ const mut_groups = new Map();
236
236
  for (const [index, e] of array.entries()) {
237
- const key = grouper(e, asUint32(index)); // Ensure index is treated as SizeType.Arr
237
+ const key = grouper(e, asUint32(index));
238
238
  const mut_group = mut_groups.get(key);
239
239
  if (mut_group !== undefined) {
240
240
  mut_group.push(e);
@@ -243,7 +243,7 @@ export function groupBy(...args) {
243
243
  mut_groups.set(key, [e]);
244
244
  }
245
245
  }
246
- // Cast to IMap<G, readonly A[]> for the public interface
246
+
247
247
  return IMap.create(mut_groups);
248
248
  }
249
249
  case 1: {
@@ -252,62 +252,62 @@ export function groupBy(...args) {
252
252
  }
253
253
  }
254
254
  }
255
- /**
256
- * Creates an array of tuples by pairing corresponding elements from two arrays.
257
- *
258
- * @example
259
- *
260
- * ```ts
261
- * const letters = ['a', 'b', 'c'] as const;
262
- *
263
- * const numbers = [1, 2, 3] as const;
264
- *
265
- * const pairs = Arr.zip(letters, numbers);
266
- *
267
- * const expectedPairs = [
268
- * ['a', 1],
269
- * ['b', 2],
270
- * ['c', 3],
271
- * ] as const;
272
- *
273
- * assert.deepStrictEqual(pairs, expectedPairs);
274
- * ```
275
- */
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
276
  export const zip = (array1, array2) =>
277
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
277
+
278
278
  seq(Uint32.min(size(array1), size(array2))).map((i) =>
279
- // Non-null assertion is safe here because `i` is always within bounds of both arrays up to the length of the shorter one.
280
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
279
+
280
+
281
281
  tp(array1[i], array2[i]));
282
- /**
283
- * Computes the cartesian product of arrays.
284
- * cartesianProduct([[1,2], [3,4]]) => [[1,3], [1,4], [2,3], [2,4]]
285
- *
286
- * @example
287
- *
288
- *
289
- * ```ts
290
- * const sizes = ['S', 'M'] as const;
291
- *
292
- * const colors = ['red', 'blue'] as const;
293
- *
294
- * const combinations = Arr.cartesianProduct([sizes, colors]);
295
- *
296
- * const expectedCombinations = [
297
- * ['S', 'red'],
298
- * ['S', 'blue'],
299
- * ['M', 'red'],
300
- * ['M', 'blue'],
301
- * ] as const;
302
- *
303
- * assert.deepStrictEqual(combinations, expectedCombinations);
304
- * ```
305
- */
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
306
  export const cartesianProduct = (arrays) => {
307
307
  if (!isNonEmpty(arrays))
308
308
  return [[]];
309
309
  const [first, ...rest] = arrays;
310
- // If first array is empty, the result is empty
310
+
311
311
  if (!isNonEmpty(first))
312
312
  return [];
313
313
  const restProduct = cartesianProduct(rest);
@@ -1,23 +1,23 @@
1
1
  import { asUint32, Num } from '../../number/index.mjs';
2
- /**
3
- * Type guard that checks if a value is an array.
4
- *
5
- * @example
6
- *
7
- * ```ts
8
- * const maybeArray: unknown = [1, 2, 3] as const;
9
- *
10
- * const maybeValue: unknown = 'Ada';
11
- *
12
- * assert.isTrue(Arr.isArray(maybeArray));
13
- *
14
- * assert.isFalse(Arr.isArray(maybeValue));
15
- *
16
- * if (Arr.isArray(maybeArray)) {
17
- * assert.deepStrictEqual(maybeArray, [1, 2, 3]);
18
- * }
19
- * ```
20
- */
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
21
  export const isArray = (value) => Array.isArray(value);
22
22
  export function every(...args) {
23
23
  switch (args.length) {
@@ -37,22 +37,22 @@ export function some(...args) {
37
37
  }
38
38
  }
39
39
  const someImpl = (array, predicate) => array.some((a, i) => predicate(a, asUint32(i)));
40
- /**
41
- * Checks if an index is within the valid range of an array.
42
- *
43
- * @example
44
- *
45
- * ```ts
46
- * const items = ['Ada', 'Grace', 'Katherine'] as const;
47
- *
48
- * assert.isTrue(Arr.indexIsInRange(items, 1));
49
- *
50
- * assert.isFalse(Arr.indexIsInRange(items, 3));
51
- *
52
- * if (Arr.indexIsInRange(items, 2)) {
53
- * assert.isTrue(items[2] === 'Katherine');
54
- * }
55
- * ```
56
- */
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
57
  export const indexIsInRange = (array, index) => Num.isInRange(0, array.length)(index);
58
58
  //# sourceMappingURL=array-utils-validation.mjs.map