@procedures/collections 0.0.0-stage → 0.2.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.
Files changed (205) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +394 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/async/async-queue.d.ts +155 -0
  6. package/dist/async/async-queue.d.ts.map +1 -0
  7. package/dist/async/async-queue.js +342 -0
  8. package/dist/async/async-queue.js.map +1 -0
  9. package/dist/async/channels.d.ts +188 -0
  10. package/dist/async/channels.d.ts.map +1 -0
  11. package/dist/async/channels.js +314 -0
  12. package/dist/async/channels.js.map +1 -0
  13. package/dist/behaviors/bounded.d.ts +79 -0
  14. package/dist/behaviors/bounded.d.ts.map +1 -0
  15. package/dist/behaviors/bounded.js +384 -0
  16. package/dist/behaviors/bounded.js.map +1 -0
  17. package/dist/behaviors/composite.d.ts +17 -0
  18. package/dist/behaviors/composite.d.ts.map +1 -0
  19. package/dist/behaviors/composite.js +93 -0
  20. package/dist/behaviors/composite.js.map +1 -0
  21. package/dist/behaviors/evented.d.ts +154 -0
  22. package/dist/behaviors/evented.d.ts.map +1 -0
  23. package/dist/behaviors/evented.js +299 -0
  24. package/dist/behaviors/evented.js.map +1 -0
  25. package/dist/behaviors/lru.d.ts +84 -0
  26. package/dist/behaviors/lru.d.ts.map +1 -0
  27. package/dist/behaviors/lru.js +376 -0
  28. package/dist/behaviors/lru.js.map +1 -0
  29. package/dist/behaviors/readonly.d.ts +73 -0
  30. package/dist/behaviors/readonly.d.ts.map +1 -0
  31. package/dist/behaviors/readonly.js +177 -0
  32. package/dist/behaviors/readonly.js.map +1 -0
  33. package/dist/behaviors/safe.d.ts +163 -0
  34. package/dist/behaviors/safe.d.ts.map +1 -0
  35. package/dist/behaviors/safe.js +176 -0
  36. package/dist/behaviors/safe.js.map +1 -0
  37. package/dist/behaviors/synchronized.d.ts +88 -0
  38. package/dist/behaviors/synchronized.d.ts.map +1 -0
  39. package/dist/behaviors/synchronized.js +285 -0
  40. package/dist/behaviors/synchronized.js.map +1 -0
  41. package/dist/behaviors/ttl.d.ts +118 -0
  42. package/dist/behaviors/ttl.d.ts.map +1 -0
  43. package/dist/behaviors/ttl.js +354 -0
  44. package/dist/behaviors/ttl.js.map +1 -0
  45. package/dist/contracts/model.d.ts +29 -0
  46. package/dist/contracts/model.d.ts.map +1 -0
  47. package/dist/contracts/model.js +26 -0
  48. package/dist/contracts/model.js.map +1 -0
  49. package/dist/core/effects.d.ts +176 -0
  50. package/dist/core/effects.d.ts.map +1 -0
  51. package/dist/core/effects.js +180 -0
  52. package/dist/core/effects.js.map +1 -0
  53. package/dist/core/events.d.ts +192 -0
  54. package/dist/core/events.d.ts.map +1 -0
  55. package/dist/core/events.js +291 -0
  56. package/dist/core/events.js.map +1 -0
  57. package/dist/core/middleware.d.ts +231 -0
  58. package/dist/core/middleware.d.ts.map +1 -0
  59. package/dist/core/middleware.js +161 -0
  60. package/dist/core/middleware.js.map +1 -0
  61. package/dist/core/policies.d.ts +220 -0
  62. package/dist/core/policies.d.ts.map +1 -0
  63. package/dist/core/policies.js +48 -0
  64. package/dist/core/policies.js.map +1 -0
  65. package/dist/core/traits.d.ts +142 -0
  66. package/dist/core/traits.d.ts.map +1 -0
  67. package/dist/core/traits.js +8 -0
  68. package/dist/core/traits.js.map +1 -0
  69. package/dist/fx/collectors.d.ts +193 -0
  70. package/dist/fx/collectors.d.ts.map +1 -0
  71. package/dist/fx/collectors.js +375 -0
  72. package/dist/fx/collectors.js.map +1 -0
  73. package/dist/fx/iter.d.ts +166 -0
  74. package/dist/fx/iter.d.ts.map +1 -0
  75. package/dist/fx/iter.js +421 -0
  76. package/dist/fx/iter.js.map +1 -0
  77. package/dist/impl/array-deque.d.ts +112 -0
  78. package/dist/impl/array-deque.d.ts.map +1 -0
  79. package/dist/impl/array-deque.js +380 -0
  80. package/dist/impl/array-deque.js.map +1 -0
  81. package/dist/impl/array-list.d.ts +101 -0
  82. package/dist/impl/array-list.d.ts.map +1 -0
  83. package/dist/impl/array-list.js +387 -0
  84. package/dist/impl/array-list.js.map +1 -0
  85. package/dist/impl/hash-map.d.ts +149 -0
  86. package/dist/impl/hash-map.d.ts.map +1 -0
  87. package/dist/impl/hash-map.js +473 -0
  88. package/dist/impl/hash-map.js.map +1 -0
  89. package/dist/impl/hash-set.d.ts +125 -0
  90. package/dist/impl/hash-set.d.ts.map +1 -0
  91. package/dist/impl/hash-set.js +264 -0
  92. package/dist/impl/hash-set.js.map +1 -0
  93. package/dist/impl/linked-hash-map.d.ts +141 -0
  94. package/dist/impl/linked-hash-map.d.ts.map +1 -0
  95. package/dist/impl/linked-hash-map.js +442 -0
  96. package/dist/impl/linked-hash-map.js.map +1 -0
  97. package/dist/impl/linked-list.d.ts +109 -0
  98. package/dist/impl/linked-list.d.ts.map +1 -0
  99. package/dist/impl/linked-list.js +494 -0
  100. package/dist/impl/linked-list.js.map +1 -0
  101. package/dist/impl/priority-queue.d.ts +139 -0
  102. package/dist/impl/priority-queue.d.ts.map +1 -0
  103. package/dist/impl/priority-queue.js +343 -0
  104. package/dist/impl/priority-queue.js.map +1 -0
  105. package/dist/impl/tree-map.d.ts +153 -0
  106. package/dist/impl/tree-map.d.ts.map +1 -0
  107. package/dist/impl/tree-map.js +788 -0
  108. package/dist/impl/tree-map.js.map +1 -0
  109. package/dist/impl/tree-set.d.ts +112 -0
  110. package/dist/impl/tree-set.d.ts.map +1 -0
  111. package/dist/impl/tree-set.js +374 -0
  112. package/dist/impl/tree-set.js.map +1 -0
  113. package/dist/index.d.ts +106 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +139 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/interfaces/collection.d.ts +119 -0
  118. package/dist/interfaces/collection.d.ts.map +1 -0
  119. package/dist/interfaces/collection.js +8 -0
  120. package/dist/interfaces/collection.js.map +1 -0
  121. package/dist/interfaces/list.d.ts +247 -0
  122. package/dist/interfaces/list.d.ts.map +1 -0
  123. package/dist/interfaces/list.js +8 -0
  124. package/dist/interfaces/list.js.map +1 -0
  125. package/dist/interfaces/map.d.ts +344 -0
  126. package/dist/interfaces/map.d.ts.map +1 -0
  127. package/dist/interfaces/map.js +8 -0
  128. package/dist/interfaces/map.js.map +1 -0
  129. package/dist/interfaces/queue.d.ts +304 -0
  130. package/dist/interfaces/queue.d.ts.map +1 -0
  131. package/dist/interfaces/queue.js +8 -0
  132. package/dist/interfaces/queue.js.map +1 -0
  133. package/dist/interfaces/set.d.ts +137 -0
  134. package/dist/interfaces/set.d.ts.map +1 -0
  135. package/dist/interfaces/set.js +8 -0
  136. package/dist/interfaces/set.js.map +1 -0
  137. package/dist/register.d.ts +8 -0
  138. package/dist/register.d.ts.map +1 -0
  139. package/dist/register.js +8 -0
  140. package/dist/register.js.map +1 -0
  141. package/dist/storage/index.d.ts +15 -0
  142. package/dist/storage/index.d.ts.map +1 -0
  143. package/dist/storage/index.js +14 -0
  144. package/dist/storage/index.js.map +1 -0
  145. package/dist/storage/interface.d.ts +141 -0
  146. package/dist/storage/interface.d.ts.map +1 -0
  147. package/dist/storage/interface.js +23 -0
  148. package/dist/storage/interface.js.map +1 -0
  149. package/dist/storage/memory.d.ts +68 -0
  150. package/dist/storage/memory.d.ts.map +1 -0
  151. package/dist/storage/memory.js +154 -0
  152. package/dist/storage/memory.js.map +1 -0
  153. package/dist/utils/defaults.d.ts +135 -0
  154. package/dist/utils/defaults.d.ts.map +1 -0
  155. package/dist/utils/defaults.js +322 -0
  156. package/dist/utils/defaults.js.map +1 -0
  157. package/dist/utils/factories.d.ts +144 -0
  158. package/dist/utils/factories.d.ts.map +1 -0
  159. package/dist/utils/factories.js +293 -0
  160. package/dist/utils/factories.js.map +1 -0
  161. package/dist/utils/helpers.d.ts +137 -0
  162. package/dist/utils/helpers.d.ts.map +1 -0
  163. package/dist/utils/helpers.js +221 -0
  164. package/dist/utils/helpers.js.map +1 -0
  165. package/package.json +68 -3
  166. package/src/async/async-queue.ts +417 -0
  167. package/src/async/channels.ts +374 -0
  168. package/src/behaviors/bounded.ts +477 -0
  169. package/src/behaviors/composite.ts +99 -0
  170. package/src/behaviors/evented.ts +464 -0
  171. package/src/behaviors/lru.ts +447 -0
  172. package/src/behaviors/readonly.ts +224 -0
  173. package/src/behaviors/safe.ts +372 -0
  174. package/src/behaviors/synchronized.ts +316 -0
  175. package/src/behaviors/ttl.ts +462 -0
  176. package/src/contracts/model.ts +44 -0
  177. package/src/core/effects.ts +323 -0
  178. package/src/core/events.ts +356 -0
  179. package/src/core/middleware.ts +415 -0
  180. package/src/core/policies.ts +316 -0
  181. package/src/core/traits.ts +164 -0
  182. package/src/fx/collectors.ts +500 -0
  183. package/src/fx/iter.ts +536 -0
  184. package/src/impl/array-deque.ts +463 -0
  185. package/src/impl/array-list.ts +490 -0
  186. package/src/impl/hash-map.ts +623 -0
  187. package/src/impl/hash-set.ts +342 -0
  188. package/src/impl/linked-hash-map.ts +572 -0
  189. package/src/impl/linked-list.ts +606 -0
  190. package/src/impl/priority-queue.ts +448 -0
  191. package/src/impl/tree-map.ts +912 -0
  192. package/src/impl/tree-set.ts +469 -0
  193. package/src/index.ts +277 -0
  194. package/src/interfaces/collection.ts +141 -0
  195. package/src/interfaces/list.ts +281 -0
  196. package/src/interfaces/map.ts +405 -0
  197. package/src/interfaces/queue.ts +353 -0
  198. package/src/interfaces/set.ts +158 -0
  199. package/src/register.ts +8 -0
  200. package/src/storage/index.ts +16 -0
  201. package/src/storage/interface.ts +179 -0
  202. package/src/storage/memory.ts +180 -0
  203. package/src/utils/defaults.ts +345 -0
  204. package/src/utils/factories.ts +357 -0
  205. package/src/utils/helpers.ts +248 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Factory utilities for creating collections.
3
+ *
4
+ * Provides convenient factory methods similar to Java's Collections class.
5
+ * These mirror methods like Collections.emptyList(), singletonList(), etc.
6
+ */
7
+ import { arrayList, ArrayList } from "../impl/array-list.js";
8
+ import { arrayDeque, ArrayDeque } from "../impl/array-deque.js";
9
+ import { hashMap, HashMap } from "../impl/hash-map.js";
10
+ import { readonly } from "../behaviors/readonly.js";
11
+ import { compose } from "../core/middleware.js";
12
+ // ============================================================================
13
+ // Empty collections
14
+ // ============================================================================
15
+ /**
16
+ * Returns an empty, immutable list.
17
+ * Multiple calls return the same instance (singleton pattern).
18
+ *
19
+ * @example
20
+ * const list = emptyList<number>()
21
+ * list.size // 0
22
+ * list.add(1) // Error: Cannot modify readonly collection
23
+ */
24
+ const EMPTY_LIST_CACHE = new Map();
25
+ export function emptyList() {
26
+ const key = "list";
27
+ if (!EMPTY_LIST_CACHE.has(key)) {
28
+ const list = compose(readonly())(arrayList());
29
+ EMPTY_LIST_CACHE.set(key, list);
30
+ }
31
+ return EMPTY_LIST_CACHE.get(key);
32
+ }
33
+ /**
34
+ * Returns an empty, immutable queue.
35
+ */
36
+ const EMPTY_QUEUE_CACHE = new Map();
37
+ export function emptyQueue() {
38
+ const key = "queue";
39
+ if (!EMPTY_QUEUE_CACHE.has(key)) {
40
+ const queue = compose(readonly())(arrayDeque());
41
+ EMPTY_QUEUE_CACHE.set(key, queue);
42
+ }
43
+ return EMPTY_QUEUE_CACHE.get(key);
44
+ }
45
+ /**
46
+ * Returns an empty, immutable map.
47
+ */
48
+ const EMPTY_MAP_CACHE = new Map();
49
+ export function emptyMap() {
50
+ const key = "map";
51
+ if (!EMPTY_MAP_CACHE.has(key)) {
52
+ const map = compose(readonly())(hashMap());
53
+ EMPTY_MAP_CACHE.set(key, map);
54
+ }
55
+ return EMPTY_MAP_CACHE.get(key);
56
+ }
57
+ // ============================================================================
58
+ // Singleton collections (single element)
59
+ // ============================================================================
60
+ /**
61
+ * Returns an immutable list containing only the specified element.
62
+ *
63
+ * @example
64
+ * const list = singletonList(42)
65
+ * list.size // 1
66
+ * list.get(0) // 42
67
+ * list.add(2) // Error: Cannot modify readonly collection
68
+ */
69
+ export function singletonList(element) {
70
+ const list = arrayList();
71
+ list.add(element);
72
+ return compose(readonly())(list);
73
+ }
74
+ /**
75
+ * Returns an immutable map containing only the specified key-value mapping.
76
+ */
77
+ export function singletonMap(key, value) {
78
+ const map = hashMap();
79
+ map.set(key, value);
80
+ return compose(readonly())(map);
81
+ }
82
+ // ============================================================================
83
+ // N-copies collections
84
+ // ============================================================================
85
+ /**
86
+ * Returns an immutable list consisting of n copies of the specified element.
87
+ *
88
+ * @example
89
+ * const list = nCopies(5, 'hello')
90
+ * list.size // 5
91
+ * list.get(2) // 'hello'
92
+ */
93
+ export function nCopies(n, element) {
94
+ if (n < 0) {
95
+ throw new Error(`n must be non-negative, got ${n}`);
96
+ }
97
+ const list = arrayList();
98
+ for (let i = 0; i < n; i++) {
99
+ list.add(element);
100
+ }
101
+ return compose(readonly())(list);
102
+ }
103
+ // ============================================================================
104
+ // Collection creation from iterables
105
+ // ============================================================================
106
+ /**
107
+ * Creates a new ArrayList from the given elements.
108
+ *
109
+ * @example
110
+ * const list = listOf(1, 2, 3, 4, 5)
111
+ */
112
+ export function listOf(...elements) {
113
+ return arrayList(elements);
114
+ }
115
+ /**
116
+ * Creates a new ArrayDeque from the given elements.
117
+ */
118
+ export function queueOf(...elements) {
119
+ return arrayDeque(elements);
120
+ }
121
+ /**
122
+ * Creates a new HashMap from the given key-value pairs.
123
+ *
124
+ * @example
125
+ * const map = mapOf(['a', 1], ['b', 2], ['c', 3])
126
+ */
127
+ export function mapOf(...entries) {
128
+ return hashMap(entries);
129
+ }
130
+ // ============================================================================
131
+ // Mutable collection factories
132
+ // ============================================================================
133
+ /**
134
+ * Creates a new mutable ArrayList with optional initial elements.
135
+ *
136
+ * @example
137
+ * const list = mutableListOf(1, 2, 3)
138
+ * list.add(4)
139
+ */
140
+ export function mutableListOf(...elements) {
141
+ return arrayList(elements);
142
+ }
143
+ /**
144
+ * Creates a new mutable HashMap with optional initial entries.
145
+ */
146
+ export function mutableMapOf(...entries) {
147
+ return hashMap(entries);
148
+ }
149
+ // ============================================================================
150
+ // Immutable collection factories
151
+ // ============================================================================
152
+ /**
153
+ * Creates an immutable List from the given elements.
154
+ *
155
+ * @example
156
+ * const list = immutableListOf(1, 2, 3)
157
+ * list.get(0) // 1
158
+ * list.add(4) // Error: Cannot modify readonly collection
159
+ */
160
+ export function immutableListOf(...elements) {
161
+ if (elements.length === 0) {
162
+ return emptyList();
163
+ }
164
+ if (elements.length === 1) {
165
+ return singletonList(elements[0]);
166
+ }
167
+ const list = arrayList(elements);
168
+ return compose(readonly())(list);
169
+ }
170
+ /**
171
+ * Creates an immutable Map from the given entries.
172
+ */
173
+ export function immutableMapOf(...entries) {
174
+ if (entries.length === 0) {
175
+ return emptyMap();
176
+ }
177
+ if (entries.length === 1) {
178
+ return singletonMap(entries[0][0], entries[0][1]);
179
+ }
180
+ const map = hashMap(entries);
181
+ return compose(readonly())(map);
182
+ }
183
+ // ============================================================================
184
+ // Range factories
185
+ // ============================================================================
186
+ /**
187
+ * Creates a list containing integers from start (inclusive) to end (exclusive).
188
+ *
189
+ * @example
190
+ * const list = range(0, 5) // [0, 1, 2, 3, 4]
191
+ * const list2 = range(10, 15) // [10, 11, 12, 13, 14]
192
+ */
193
+ export function range(start, end, step = 1) {
194
+ if (step === 0) {
195
+ throw new Error("step cannot be zero");
196
+ }
197
+ const list = arrayList();
198
+ if (step > 0) {
199
+ for (let i = start; i < end; i += step) {
200
+ list.add(i);
201
+ }
202
+ }
203
+ else {
204
+ for (let i = start; i > end; i += step) {
205
+ list.add(i);
206
+ }
207
+ }
208
+ return list;
209
+ }
210
+ /**
211
+ * Creates a list containing integers from 0 to n (exclusive).
212
+ *
213
+ * @example
214
+ * const list = rangeTo(5) // [0, 1, 2, 3, 4]
215
+ */
216
+ export function rangeTo(n) {
217
+ return range(0, n);
218
+ }
219
+ // ============================================================================
220
+ // Collection builders
221
+ // ============================================================================
222
+ /**
223
+ * Builder for constructing lists with a fluent API.
224
+ *
225
+ * @example
226
+ * const list = buildList<number>((builder) => {
227
+ * builder.add(1)
228
+ * builder.add(2)
229
+ * if (someCondition) {
230
+ * builder.add(3)
231
+ * }
232
+ * })
233
+ */
234
+ export function buildList(builder) {
235
+ const list = arrayList();
236
+ builder(list);
237
+ return list;
238
+ }
239
+ /**
240
+ * Builder for constructing maps with a fluent API.
241
+ */
242
+ export function buildMap(builder) {
243
+ const map = hashMap();
244
+ builder(map);
245
+ return map;
246
+ }
247
+ // ============================================================================
248
+ // Conversion utilities
249
+ // ============================================================================
250
+ /**
251
+ * Converts an iterable to an ArrayList.
252
+ *
253
+ * @example
254
+ * const set = new Set([1, 2, 3])
255
+ * const list = toList(set)
256
+ */
257
+ export function toList(iterable) {
258
+ return arrayList(iterable);
259
+ }
260
+ export function toMap(iterable, keyExtractor, valueExtractor) {
261
+ const map = hashMap();
262
+ for (const item of iterable) {
263
+ const key = keyExtractor(item);
264
+ const value = valueExtractor ? valueExtractor(item) : item;
265
+ map.set(key, value);
266
+ }
267
+ return map;
268
+ }
269
+ // ============================================================================
270
+ // Grouping utilities
271
+ // ============================================================================
272
+ /**
273
+ * Groups elements by a key extractor function.
274
+ *
275
+ * @example
276
+ * const users = [
277
+ * { age: 25, name: 'Alice' },
278
+ * { age: 30, name: 'Bob' },
279
+ * { age: 25, name: 'Charlie' }
280
+ * ]
281
+ * const byAge = groupBy(users, u => u.age)
282
+ * // Map { 25 => [Alice, Charlie], 30 => [Bob] }
283
+ */
284
+ export function groupBy(iterable, keyExtractor) {
285
+ const map = hashMap();
286
+ for (const item of iterable) {
287
+ const key = keyExtractor(item);
288
+ const list = map.computeIfAbsent(key, () => arrayList());
289
+ list.add(item);
290
+ }
291
+ return map;
292
+ }
293
+ //# sourceMappingURL=factories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factories.js","sourceRoot":"","sources":["../../src/utils/factories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Common helper utilities for collections.
3
+ *
4
+ * Provides shared functionality to reduce code duplication across implementations.
5
+ */
6
+ import type { Eq } from "../core/traits.js";
7
+ /**
8
+ * Checks if an index is within valid bounds [0, size).
9
+ * Throws RangeError if out of bounds.
10
+ *
11
+ * @param index The index to check
12
+ * @param size The size of the collection
13
+ * @param collectionName Optional name for error message
14
+ * @throws RangeError if index is out of bounds
15
+ */
16
+ export declare function checkBounds(index: number, size: number, collectionName?: string): void;
17
+ /**
18
+ * Checks if an index is valid for insertion [0, size].
19
+ * Allows index === size for append operations.
20
+ *
21
+ * @param index The index to check
22
+ * @param size The size of the collection
23
+ * @param collectionName Optional name for error message
24
+ * @throws RangeError if index is out of bounds
25
+ */
26
+ export declare function checkInsertBounds(index: number, size: number, collectionName?: string): void;
27
+ /**
28
+ * Checks if a range [start, end) is valid.
29
+ *
30
+ * @param start Start index (inclusive)
31
+ * @param end End index (exclusive)
32
+ * @param size The size of the collection
33
+ * @param collectionName Optional name for error message
34
+ * @throws RangeError if range is invalid
35
+ */
36
+ export declare function checkRangeBounds(start: number, end: number, size: number, collectionName?: string): void;
37
+ /**
38
+ * Finds the index of an element in an array using custom equality.
39
+ *
40
+ * @param array The array to search
41
+ * @param element The element to find
42
+ * @param eq Equality function
43
+ * @returns Index of element, or -1 if not found
44
+ */
45
+ export declare function findIndex<T>(array: T[], element: T, eq: Eq<T>): number;
46
+ /**
47
+ * Finds the last index of an element in an array using custom equality.
48
+ *
49
+ * @param array The array to search
50
+ * @param element The element to find
51
+ * @param eq Equality function
52
+ * @returns Last index of element, or -1 if not found
53
+ */
54
+ export declare function findLastIndex<T>(array: T[], element: T, eq: Eq<T>): number;
55
+ /**
56
+ * Checks if an array contains an element using custom equality.
57
+ *
58
+ * @param array The array to search
59
+ * @param element The element to find
60
+ * @param eq Equality function
61
+ * @returns true if element is found
62
+ */
63
+ export declare function arrayContains<T>(array: T[], element: T, eq: Eq<T>): boolean;
64
+ /**
65
+ * Removes the first occurrence of an element from an array.
66
+ *
67
+ * @param array The array to modify
68
+ * @param element The element to remove
69
+ * @param eq Equality function
70
+ * @returns true if element was found and removed
71
+ */
72
+ export declare function arrayRemove<T>(array: T[], element: T, eq: Eq<T>): boolean;
73
+ /**
74
+ * Removes all occurrences of an element from an array.
75
+ *
76
+ * @param array The array to modify
77
+ * @param element The element to remove
78
+ * @param eq Equality function
79
+ * @returns Number of elements removed
80
+ */
81
+ export declare function arrayRemoveAll<T>(array: T[], element: T, eq: Eq<T>): number;
82
+ /**
83
+ * Creates a simple iterator for an array.
84
+ *
85
+ * @param array The array to iterate
86
+ * @returns Iterator over the array
87
+ */
88
+ export declare function arrayIterator<T>(array: T[]): Iterator<T>;
89
+ /**
90
+ * Creates a reversed iterator for an array.
91
+ *
92
+ * @param array The array to iterate
93
+ * @returns Reversed iterator over the array
94
+ */
95
+ export declare function reverseArrayIterator<T>(array: T[]): Iterator<T>;
96
+ /**
97
+ * Converts an iterable to an array.
98
+ *
99
+ * @param iterable The iterable to convert
100
+ * @returns Array containing all elements
101
+ */
102
+ export declare function toArray<T>(iterable: Iterable<T>): T[];
103
+ /**
104
+ * Ensures a value is not null or undefined.
105
+ *
106
+ * @param value The value to check
107
+ * @param message Error message
108
+ * @returns The non-null value
109
+ * @throws Error if value is null or undefined
110
+ */
111
+ export declare function requireNonNull<T>(value: T | null | undefined, message?: string): T;
112
+ /**
113
+ * Ensures a collection is not empty.
114
+ *
115
+ * @param size Current size
116
+ * @param collectionName Optional name for error message
117
+ * @throws Error if collection is empty
118
+ */
119
+ export declare function requireNonEmpty(size: number, collectionName?: string): void;
120
+ /**
121
+ * Clamps a value between min and max.
122
+ *
123
+ * @param value The value to clamp
124
+ * @param min Minimum value
125
+ * @param max Maximum value
126
+ * @returns Clamped value
127
+ */
128
+ export declare function clamp(value: number, min: number, max: number): number;
129
+ /**
130
+ * Calculates hash code for a string.
131
+ * Uses Java's String.hashCode() algorithm.
132
+ *
133
+ * @param str The string to hash
134
+ * @returns Hash code
135
+ */
136
+ export declare function stringHashCode(str: string): number;
137
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAM5C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,MAAqB,GAAG,IAAI,CAIpG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,MAAqB,GAAG,IAAI,CAI1G;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,MAAqB,GACpC,IAAI,CAMN;AAMD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAOtE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAO1E;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAKzE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAS3E;AAMD;;;;;GAKG;AACH,wBAAiB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEzD;AAED;;;;;GAKG;AACH,wBAAiB,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAErD;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,GAAE,MAA4C,GAAG,CAAC,CAKvH;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,MAAqB,GAAG,IAAI,CAIzF;AAMD;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQlD"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Common helper utilities for collections.
3
+ *
4
+ * Provides shared functionality to reduce code duplication across implementations.
5
+ */
6
+ // ============================================================================
7
+ // Bounds checking utilities
8
+ // ============================================================================
9
+ /**
10
+ * Checks if an index is within valid bounds [0, size).
11
+ * Throws RangeError if out of bounds.
12
+ *
13
+ * @param index The index to check
14
+ * @param size The size of the collection
15
+ * @param collectionName Optional name for error message
16
+ * @throws RangeError if index is out of bounds
17
+ */
18
+ export function checkBounds(index, size, collectionName = "Collection") {
19
+ if (index < 0 || index >= size) {
20
+ throw new RangeError(`${collectionName}: Index ${index} out of bounds [0, ${size})`);
21
+ }
22
+ }
23
+ /**
24
+ * Checks if an index is valid for insertion [0, size].
25
+ * Allows index === size for append operations.
26
+ *
27
+ * @param index The index to check
28
+ * @param size The size of the collection
29
+ * @param collectionName Optional name for error message
30
+ * @throws RangeError if index is out of bounds
31
+ */
32
+ export function checkInsertBounds(index, size, collectionName = "Collection") {
33
+ if (index < 0 || index > size) {
34
+ throw new RangeError(`${collectionName}: Index ${index} out of bounds [0, ${size}]`);
35
+ }
36
+ }
37
+ /**
38
+ * Checks if a range [start, end) is valid.
39
+ *
40
+ * @param start Start index (inclusive)
41
+ * @param end End index (exclusive)
42
+ * @param size The size of the collection
43
+ * @param collectionName Optional name for error message
44
+ * @throws RangeError if range is invalid
45
+ */
46
+ export function checkRangeBounds(start, end, size, collectionName = "Collection") {
47
+ if (start < 0 || end > size || start > end) {
48
+ throw new RangeError(`${collectionName}: Invalid range [${start}, ${end}) for size ${size}`);
49
+ }
50
+ }
51
+ // ============================================================================
52
+ // Equality and search utilities
53
+ // ============================================================================
54
+ /**
55
+ * Finds the index of an element in an array using custom equality.
56
+ *
57
+ * @param array The array to search
58
+ * @param element The element to find
59
+ * @param eq Equality function
60
+ * @returns Index of element, or -1 if not found
61
+ */
62
+ export function findIndex(array, element, eq) {
63
+ for (let i = 0; i < array.length; i++) {
64
+ if (eq(array[i], element)) {
65
+ return i;
66
+ }
67
+ }
68
+ return -1;
69
+ }
70
+ /**
71
+ * Finds the last index of an element in an array using custom equality.
72
+ *
73
+ * @param array The array to search
74
+ * @param element The element to find
75
+ * @param eq Equality function
76
+ * @returns Last index of element, or -1 if not found
77
+ */
78
+ export function findLastIndex(array, element, eq) {
79
+ for (let i = array.length - 1; i >= 0; i--) {
80
+ if (eq(array[i], element)) {
81
+ return i;
82
+ }
83
+ }
84
+ return -1;
85
+ }
86
+ /**
87
+ * Checks if an array contains an element using custom equality.
88
+ *
89
+ * @param array The array to search
90
+ * @param element The element to find
91
+ * @param eq Equality function
92
+ * @returns true if element is found
93
+ */
94
+ export function arrayContains(array, element, eq) {
95
+ return findIndex(array, element, eq) !== -1;
96
+ }
97
+ /**
98
+ * Removes the first occurrence of an element from an array.
99
+ *
100
+ * @param array The array to modify
101
+ * @param element The element to remove
102
+ * @param eq Equality function
103
+ * @returns true if element was found and removed
104
+ */
105
+ export function arrayRemove(array, element, eq) {
106
+ const index = findIndex(array, element, eq);
107
+ if (index === -1)
108
+ return false;
109
+ array.splice(index, 1);
110
+ return true;
111
+ }
112
+ /**
113
+ * Removes all occurrences of an element from an array.
114
+ *
115
+ * @param array The array to modify
116
+ * @param element The element to remove
117
+ * @param eq Equality function
118
+ * @returns Number of elements removed
119
+ */
120
+ export function arrayRemoveAll(array, element, eq) {
121
+ let count = 0;
122
+ for (let i = array.length - 1; i >= 0; i--) {
123
+ if (eq(array[i], element)) {
124
+ array.splice(i, 1);
125
+ count++;
126
+ }
127
+ }
128
+ return count;
129
+ }
130
+ // ============================================================================
131
+ // Iterator utilities
132
+ // ============================================================================
133
+ /**
134
+ * Creates a simple iterator for an array.
135
+ *
136
+ * @param array The array to iterate
137
+ * @returns Iterator over the array
138
+ */
139
+ export function* arrayIterator(array) {
140
+ yield* array;
141
+ }
142
+ /**
143
+ * Creates a reversed iterator for an array.
144
+ *
145
+ * @param array The array to iterate
146
+ * @returns Reversed iterator over the array
147
+ */
148
+ export function* reverseArrayIterator(array) {
149
+ for (let i = array.length - 1; i >= 0; i--) {
150
+ yield array[i];
151
+ }
152
+ }
153
+ /**
154
+ * Converts an iterable to an array.
155
+ *
156
+ * @param iterable The iterable to convert
157
+ * @returns Array containing all elements
158
+ */
159
+ export function toArray(iterable) {
160
+ return Array.from(iterable);
161
+ }
162
+ // ============================================================================
163
+ // Validation utilities
164
+ // ============================================================================
165
+ /**
166
+ * Ensures a value is not null or undefined.
167
+ *
168
+ * @param value The value to check
169
+ * @param message Error message
170
+ * @returns The non-null value
171
+ * @throws Error if value is null or undefined
172
+ */
173
+ export function requireNonNull(value, message = "Value cannot be null or undefined") {
174
+ if (value === null || value === undefined) {
175
+ throw new Error(message);
176
+ }
177
+ return value;
178
+ }
179
+ /**
180
+ * Ensures a collection is not empty.
181
+ *
182
+ * @param size Current size
183
+ * @param collectionName Optional name for error message
184
+ * @throws Error if collection is empty
185
+ */
186
+ export function requireNonEmpty(size, collectionName = "Collection") {
187
+ if (size === 0) {
188
+ throw new Error(`${collectionName} is empty`);
189
+ }
190
+ }
191
+ // ============================================================================
192
+ // Math utilities
193
+ // ============================================================================
194
+ /**
195
+ * Clamps a value between min and max.
196
+ *
197
+ * @param value The value to clamp
198
+ * @param min Minimum value
199
+ * @param max Maximum value
200
+ * @returns Clamped value
201
+ */
202
+ export function clamp(value, min, max) {
203
+ return Math.max(min, Math.min(max, value));
204
+ }
205
+ /**
206
+ * Calculates hash code for a string.
207
+ * Uses Java's String.hashCode() algorithm.
208
+ *
209
+ * @param str The string to hash
210
+ * @returns Hash code
211
+ */
212
+ export function stringHashCode(str) {
213
+ let hash = 0;
214
+ for (let i = 0; i < str.length; i++) {
215
+ const char = str.charCodeAt(i);
216
+ hash = ((hash << 5) - hash) + char;
217
+ hash = hash & hash; // Convert to 32-bit integer
218
+ }
219
+ return hash;
220
+ }
221
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"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"}