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
@@ -1,306 +1,306 @@
1
1
  import { asUint32 } from '../number/index.mjs';
2
2
  import { unknownToString } from '../others/index.mjs';
3
- /** Provides utility functions for ISetMapped. */
3
+
4
4
  export var ISetMapped;
5
5
  (function (ISetMapped) {
6
- /**
7
- * Creates a new ISetMapped instance with custom element transformation
8
- * functions.
9
- *
10
- * This factory function creates an immutable set that can use complex objects
11
- * as elements by providing bidirectional transformation functions. The
12
- * `toKey` function converts your custom element type to a primitive type that
13
- * can be efficiently stored, while `fromKey` reconstructs the original
14
- * element type for iteration and access.
15
- *
16
- * **Performance:** O(n) where n is the number of elements in the iterable.
17
- *
18
- * @example
19
- *
20
- * ```ts
21
- * type Point = Readonly<{ x: number; tag: string }>;
22
- *
23
- * const toKey = (point: Point) => JSON.stringify(point);
24
- *
25
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
26
- * const fromKey = (key: string) => JSON.parse(key) as Point;
27
- *
28
- * const set = ISetMapped.create<Point, string>(
29
- * [
30
- * { x: 1, tag: 'a' },
31
- * { x: 1, tag: 'a' },
32
- * { x: 2, tag: 'b' },
33
- * ],
34
- * toKey,
35
- * fromKey,
36
- * );
37
- *
38
- * assert.deepStrictEqual(Array.from(set), [
39
- * { x: 1, tag: 'a' },
40
- * { x: 2, tag: 'b' },
41
- * ]);
42
- * ```
43
- *
44
- * @template K The type of the custom elements.
45
- * @template KM The type of the mapped primitive keys.
46
- * @param iterable An iterable of elements using the custom element type.
47
- * @param toKey A function that converts a custom element `K` to a primitive
48
- * key `KM`. This function must be deterministic and produce unique values
49
- * for unique elements.
50
- * @param fromKey A function that converts a primitive key `KM` back to the
51
- * custom element `K`. This should be the inverse of `toKey`.
52
- * @returns A new ISetMapped instance containing all unique elements from the
53
- * iterable.
54
- */
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
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
55
  ISetMapped.create = (iterable, toKey, fromKey) => new ISetMappedClass(iterable, toKey, fromKey);
56
- /**
57
- * Checks if two ISetMapped instances are structurally equal.
58
- *
59
- * Two ISetMapped instances are considered equal if they have the same size
60
- * and contain exactly the same elements. The comparison is performed on the
61
- * underlying mapped keys, so the transformation functions themselves don't
62
- * need to be identical. Elements are compared based on their mapped key
63
- * representations.
64
- *
65
- * **Performance:** O(n) where n is the size of the smaller set.
66
- *
67
- * @example
68
- *
69
- * ```ts
70
- * type Point = Readonly<{ x: number; tag: string }>;
71
- *
72
- * const toKey = (point: Point) => JSON.stringify(point);
73
- *
74
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
75
- * const fromKey = (key: string) => JSON.parse(key) as Point;
76
- *
77
- * const first = ISetMapped.create<Point, string>(
78
- * [
79
- * { x: 1, tag: 'a' },
80
- * { x: 2, tag: 'b' },
81
- * ],
82
- * toKey,
83
- * fromKey,
84
- * );
85
- *
86
- * const second = ISetMapped.create<Point, string>(
87
- * [
88
- * { x: 2, tag: 'b' },
89
- * { x: 1, tag: 'a' },
90
- * ],
91
- * toKey,
92
- * fromKey,
93
- * );
94
- *
95
- * const third = ISetMapped.create<Point, string>(
96
- * [{ x: 3, tag: 'c' }],
97
- * toKey,
98
- * fromKey,
99
- * );
100
- *
101
- * assert.isTrue(ISetMapped.equal(first, second));
102
- *
103
- * assert.isFalse(ISetMapped.equal(first, third));
104
- * ```
105
- *
106
- * @template K The type of the custom elements.
107
- * @template KM The type of the mapped primitive keys.
108
- * @param a The first ISetMapped instance to compare.
109
- * @param b The second ISetMapped instance to compare.
110
- * @returns `true` if the sets contain exactly the same elements, `false`
111
- * otherwise.
112
- */
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
113
  ISetMapped.equal = (a, b) => a.size === b.size && a.every((e) => b.has(e));
114
- /**
115
- * Computes the difference between two ISetMapped instances.
116
- *
117
- * @example
118
- *
119
- * ```ts
120
- * type Point = Readonly<{ x: number; tag: string }>;
121
- *
122
- * const toKey = (point: Point) => JSON.stringify(point);
123
- *
124
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
125
- * const fromKey = (key: string) => JSON.parse(key) as Point;
126
- *
127
- * const previous = ISetMapped.create<Point, string>(
128
- * [
129
- * { x: 1, tag: 'a' },
130
- * { x: 2, tag: 'b' },
131
- * ],
132
- * toKey,
133
- * fromKey,
134
- * );
135
- *
136
- * const current = ISetMapped.create<Point, string>(
137
- * [
138
- * { x: 2, tag: 'b' },
139
- * { x: 3, tag: 'c' },
140
- * ],
141
- * toKey,
142
- * fromKey,
143
- * );
144
- *
145
- * const { added, deleted } = ISetMapped.diff(previous, current);
146
- *
147
- * assert.deepStrictEqual(Array.from(added), [{ x: 3, tag: 'c' }]);
148
- *
149
- * assert.deepStrictEqual(Array.from(deleted), [{ x: 1, tag: 'a' }]);
150
- * ```
151
- *
152
- * @template K The type of the elements.
153
- * @template KM The type of the mapped keys.
154
- * @param oldSet The original set.
155
- * @param newSet The new set.
156
- * @returns An object containing sets of added and deleted elements.
157
- */
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
158
  ISetMapped.diff = (oldSet, newSet) => ({
159
159
  deleted: oldSet.subtract(newSet),
160
160
  added: newSet.subtract(oldSet),
161
161
  });
162
- /**
163
- * Computes the intersection of two ISetMapped instances.
164
- *
165
- * @example
166
- *
167
- * ```ts
168
- * type Point = Readonly<{ x: number; tag: string }>;
169
- *
170
- * const toKey = (point: Point) => JSON.stringify(point);
171
- *
172
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
173
- * const fromKey = (key: string) => JSON.parse(key) as Point;
174
- *
175
- * const left = ISetMapped.create<Point, string>(
176
- * [
177
- * { x: 1, tag: 'a' },
178
- * { x: 2, tag: 'b' },
179
- * ],
180
- * toKey,
181
- * fromKey,
182
- * );
183
- *
184
- * const right = ISetMapped.create<Point, string>(
185
- * [{ x: 2, tag: 'b' }],
186
- * toKey,
187
- * fromKey,
188
- * );
189
- *
190
- * const overlap = ISetMapped.intersection(left, right);
191
- *
192
- * assert.deepStrictEqual(Array.from(overlap), [{ x: 2, tag: 'b' }]);
193
- * ```
194
- *
195
- * @template K The type of the elements.
196
- * @template KM The type of the mapped keys.
197
- * @param a The first set.
198
- * @param b The second set.
199
- * @returns A new ISetMapped instance representing the intersection.
200
- */
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
201
  ISetMapped.intersection = (a, b) => a.intersect(b);
202
- /**
203
- * Computes the union of two ISetMapped instances.
204
- *
205
- * @example
206
- *
207
- * ```ts
208
- * type Point = Readonly<{ x: number; tag: string }>;
209
- *
210
- * const toKey = (point: Point) => JSON.stringify(point);
211
- *
212
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
213
- * const fromKey = (key: string) => JSON.parse(key) as Point;
214
- *
215
- * const left = ISetMapped.create<Point, string>(
216
- * [{ x: 1, tag: 'a' }],
217
- * toKey,
218
- * fromKey,
219
- * );
220
- *
221
- * const right = ISetMapped.create<Point, string>(
222
- * [{ x: 2, tag: 'b' }],
223
- * toKey,
224
- * fromKey,
225
- * );
226
- *
227
- * const combined = ISetMapped.union(left, right);
228
- *
229
- * assert.deepStrictEqual(Array.from(combined), [
230
- * { x: 1, tag: 'a' },
231
- * { x: 2, tag: 'b' },
232
- * ]);
233
- * ```
234
- *
235
- * @template K The type of the elements.
236
- * @template KM The type of the mapped keys.
237
- * @param a The first set.
238
- * @param b The second set.
239
- * @returns A new ISetMapped instance representing the union.
240
- */
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
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
241
  ISetMapped.union = (a, b) => a.union(b);
242
242
  })(ISetMapped || (ISetMapped = {}));
243
- /**
244
- * Internal class implementation for ISetMapped providing immutable set
245
- * operations with element transformation.
246
- *
247
- * This class implements the ISetMapped interface by maintaining a JavaScript
248
- * Set with primitive keys internally while exposing an API that works with
249
- * custom element types. The transformation between custom and primitive
250
- * elements is handled transparently through the provided `toKey` and `fromKey`
251
- * functions.
252
- *
253
- * **Implementation Details:**
254
- *
255
- * - Uses ReadonlySet<KM> internally where KM is the primitive key type
256
- * - Stores transformation functions for bidirectional element conversion
257
- * - Implements copy-on-write semantics for efficiency
258
- * - Provides optional debug messaging for development
259
- *
260
- * @template K The type of the custom elements.
261
- * @template KM The type of the mapped primitive keys.
262
- * @implements ISetMapped
263
- * @implements Iterable
264
- * @internal This class should not be used directly. Use ISetMapped.create() instead.
265
- */
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
266
  class ISetMappedClass {
267
267
  #set;
268
268
  #toKey;
269
269
  #fromKey;
270
270
  #showNotFoundMessage;
271
- /**
272
- * Constructs an ISetMappedClass instance with custom element transformation.
273
- *
274
- * @param iterable An iterable of elements using the custom element type K.
275
- * @param toKey A function that converts a custom element K to a primitive key
276
- * KM. Must be deterministic and produce unique values for unique elements.
277
- * @param fromKey A function that converts a primitive key KM back to the
278
- * custom element K. Should be the inverse of the toKey function.
279
- * @param showNotFoundMessage Whether to log warning messages when operations
280
- * are performed on non-existent elements. Useful for debugging. Defaults to
281
- * false for production use.
282
- * @internal Use ISetMapped.create() instead of calling this constructor directly.
283
- */
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
284
  constructor(iterable, toKey, fromKey, showNotFoundMessage = false) {
285
285
  this.#set = new Set(Array.from(iterable, toKey));
286
286
  this.#toKey = toKey;
287
287
  this.#fromKey = fromKey;
288
288
  this.#showNotFoundMessage = showNotFoundMessage;
289
289
  }
290
- /** @inheritdoc */
290
+
291
291
  get size() {
292
292
  return asUint32(this.#set.size);
293
293
  }
294
- /** @inheritdoc */
294
+
295
295
  get isEmpty() {
296
296
  return this.size === 0;
297
297
  }
298
- /** @inheritdoc */
298
+
299
299
  has(key) {
300
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
300
+
301
301
  return this.#set.has(this.#toKey(key));
302
302
  }
303
- /** @inheritdoc */
303
+
304
304
  every(predicate) {
305
305
  for (const key of this.values()) {
306
306
  if (!predicate(key))
@@ -308,7 +308,7 @@ class ISetMappedClass {
308
308
  }
309
309
  return true;
310
310
  }
311
- /** @inheritdoc */
311
+
312
312
  some(predicate) {
313
313
  for (const key of this.values()) {
314
314
  if (predicate(key))
@@ -316,13 +316,13 @@ class ISetMappedClass {
316
316
  }
317
317
  return false;
318
318
  }
319
- /** @inheritdoc */
319
+
320
320
  add(key) {
321
321
  if (this.has(key))
322
322
  return this;
323
323
  return ISetMapped.create([...this.#set, this.#toKey(key)].map(this.#fromKey), this.#toKey, this.#fromKey);
324
324
  }
325
- /** @inheritdoc */
325
+
326
326
  delete(key) {
327
327
  if (!this.has(key)) {
328
328
  if (this.#showNotFoundMessage) {
@@ -335,7 +335,7 @@ class ISetMappedClass {
335
335
  .filter((k) => !Object.is(k, keyMapped))
336
336
  .map(this.#fromKey), this.#toKey, this.#fromKey);
337
337
  }
338
- /** @inheritdoc */
338
+
339
339
  withMutations(actions) {
340
340
  const mut_result = new Set(this.#set);
341
341
  const updateFn = (action) => {
@@ -354,105 +354,105 @@ class ISetMappedClass {
354
354
  }
355
355
  return ISetMapped.create(Array.from(mut_result, this.#fromKey), this.#toKey, this.#fromKey);
356
356
  }
357
- /** @inheritdoc */
357
+
358
358
  map(mapFn) {
359
359
  return ISetMapped.create(this.toArray().map(mapFn), this.#toKey, this.#fromKey);
360
360
  }
361
- /** @inheritdoc */
361
+
362
362
  filter(predicate) {
363
363
  return ISetMapped.create(this.toArray().filter(predicate), this.#toKey, this.#fromKey);
364
364
  }
365
- /** @inheritdoc */
365
+
366
366
  filterNot(predicate) {
367
367
  return ISetMapped.create(this.toArray().filter((k) => !predicate(k)), this.#toKey, this.#fromKey);
368
368
  }
369
- /** @inheritdoc */
369
+
370
370
  forEach(callbackfn) {
371
371
  for (const km of this.#set) {
372
372
  callbackfn(this.#fromKey(km));
373
373
  }
374
374
  }
375
- /** @inheritdoc */
375
+
376
376
  isSubsetOf(set) {
377
377
  return this.every((k) => set.has(k));
378
378
  }
379
- /** @inheritdoc */
379
+
380
380
  isSupersetOf(set) {
381
381
  return set.every((k) => this.has(k));
382
382
  }
383
- /** @inheritdoc */
383
+
384
384
  subtract(set) {
385
385
  return ISetMapped.create(this.toArray().filter((k) => !set.has(k)), this.#toKey, this.#fromKey);
386
386
  }
387
- /** @inheritdoc */
387
+
388
388
  intersect(set) {
389
389
  return ISetMapped.create(this.toArray().filter((k) => set.has(k)), this.#toKey, this.#fromKey);
390
390
  }
391
- /** @inheritdoc */
391
+
392
392
  union(set) {
393
393
  return ISetMapped.create([...this.values(), ...set.values()], this.#toKey, this.#fromKey);
394
394
  }
395
- /**
396
- * @example
397
- *
398
- * ```ts
399
- * type Point = Readonly<{ x: number; tag: string }>;
400
- *
401
- * const toKey = (point: Point) => JSON.stringify(point);
402
- *
403
- * // eslint-disable-next-line total-functions/no-unsafe-type-assertion
404
- * const fromKey = (key: string) => JSON.parse(key) as Point;
405
- *
406
- * const set = ISetMapped.create<Point, string>(
407
- * [
408
- * { x: 1, tag: 'a' },
409
- * { x: 2, tag: 'b' },
410
- * ],
411
- * toKey,
412
- * fromKey,
413
- * );
414
- *
415
- * const collected = Array.from(set);
416
- *
417
- * assert.deepStrictEqual(collected, [
418
- * { x: 1, tag: 'a' },
419
- * { x: 2, tag: 'b' },
420
- * ]);
421
- * ```
422
- *
423
- * @inheritdoc
424
- */
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
425
  *[Symbol.iterator]() {
426
426
  for (const k of this.keys()) {
427
427
  yield k;
428
428
  }
429
429
  }
430
- /** @inheritdoc */
430
+
431
431
  *keys() {
432
432
  for (const km of this.#set) {
433
433
  yield this.#fromKey(km);
434
434
  }
435
435
  }
436
- /** @inheritdoc */
436
+
437
437
  *values() {
438
438
  for (const km of this.#set) {
439
- // JavaScript Set's values() is an alias for keys()
439
+
440
440
  yield this.#fromKey(km);
441
441
  }
442
442
  }
443
- /** @inheritdoc */
443
+
444
444
  *entries() {
445
445
  for (const km of this.#set) {
446
- // JavaScript Set's entries() yields [value, value]
446
+
447
447
  const a = this.#fromKey(km);
448
448
  yield [a, a];
449
449
  }
450
450
  }
451
- /** @inheritdoc */
451
+
452
452
  toArray() {
453
453
  return Array.from(this.values());
454
454
  }
455
- /** @inheritdoc */
455
+
456
456
  toRawSet() {
457
457
  return this.#set;
458
458
  }