@procedures/collections 0.0.0-stage → 0.1.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 +5 -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,442 @@
1
+ /**
2
+ * LinkedHashMap - HashMap that maintains insertion order.
3
+ *
4
+ * Combines a hash table with a doubly-linked list to maintain predictable
5
+ * iteration order. Mirrors java.util.LinkedHashMap.
6
+ *
7
+ * Key features:
8
+ * - O(1) access, insert, delete (like HashMap)
9
+ * - Predictable iteration order (insertion order or access order)
10
+ * - Perfect for LRU caches when accessOrder is true
11
+ *
12
+ * @example
13
+ * const map = linkedHashMap<string, number>()
14
+ * map.set('a', 1)
15
+ * map.set('b', 2)
16
+ * map.set('c', 3)
17
+ * // Iteration order: a, b, c (insertion order)
18
+ *
19
+ * @example
20
+ * // LRU cache with access order
21
+ * const lru = linkedHashMap<string, number>({ accessOrder: true })
22
+ * lru.set('a', 1)
23
+ * lru.set('b', 2)
24
+ * lru.get('a') // Moves 'a' to end
25
+ * // Iteration order: b, a (access order)
26
+ */
27
+ import { defaultEq, defaultHash } from "../utils/defaults.js";
28
+ /**
29
+ * LinkedHashMap<K, V> - Hash map with predictable iteration order.
30
+ *
31
+ * Maintains a doubly-linked list of entries to preserve insertion order
32
+ * (or access order if accessOrder is true).
33
+ */
34
+ export class LinkedHashMap {
35
+ _buckets;
36
+ _size = 0;
37
+ _loadFactor;
38
+ _eq;
39
+ _hash;
40
+ _valueEq;
41
+ _accessOrder;
42
+ // Doubly-linked list sentinels
43
+ _head = null;
44
+ _tail = null;
45
+ constructor(options = {}) {
46
+ const { initialCapacity = 16, loadFactor = 0.75, eq = defaultEq, hash = defaultHash, valueEq = defaultEq, accessOrder = false, } = options;
47
+ this._buckets = new Array(Math.max(1, initialCapacity)).fill(null);
48
+ this._loadFactor = loadFactor;
49
+ this._eq = eq;
50
+ this._hash = hash;
51
+ this._valueEq = valueEq;
52
+ this._accessOrder = accessOrder;
53
+ }
54
+ // ========================================================================
55
+ // Size and state
56
+ // ========================================================================
57
+ get size() {
58
+ return this._size;
59
+ }
60
+ get isEmpty() {
61
+ return this._size === 0;
62
+ }
63
+ get eq() {
64
+ return this._eq;
65
+ }
66
+ get keyEq() {
67
+ return this._eq;
68
+ }
69
+ get valueEq() {
70
+ return this._valueEq;
71
+ }
72
+ get hash() {
73
+ return this._hash;
74
+ }
75
+ // ========================================================================
76
+ // Lookup operations
77
+ // ========================================================================
78
+ has(key) {
79
+ return this.getNode(key) !== null;
80
+ }
81
+ containsKey(key) {
82
+ return this.has(key);
83
+ }
84
+ containsValue(value) {
85
+ let node = this._head;
86
+ while (node !== null) {
87
+ if (this._valueEq(node.value, value)) {
88
+ return true;
89
+ }
90
+ node = node.after;
91
+ }
92
+ return false;
93
+ }
94
+ get(key) {
95
+ const node = this.getNode(key);
96
+ if (node === null) {
97
+ throw new Error("Key not found");
98
+ }
99
+ if (this._accessOrder) {
100
+ this.moveToEnd(node);
101
+ }
102
+ return node.value;
103
+ }
104
+ getOrUndefined(key) {
105
+ const node = this.getNode(key);
106
+ if (node === null)
107
+ return undefined;
108
+ if (this._accessOrder) {
109
+ this.moveToEnd(node);
110
+ }
111
+ return node.value;
112
+ }
113
+ getOrDefault(key, defaultValue) {
114
+ const node = this.getNode(key);
115
+ if (node === null)
116
+ return defaultValue;
117
+ if (this._accessOrder) {
118
+ this.moveToEnd(node);
119
+ }
120
+ return node.value;
121
+ }
122
+ // ========================================================================
123
+ // Modification operations
124
+ // ========================================================================
125
+ set(key, value) {
126
+ const hashCode = this._hash(key);
127
+ const index = this.getBucketIndex(hashCode);
128
+ let node = this._buckets[index] ?? null;
129
+ // Check if key already exists
130
+ while (node !== null) {
131
+ if (node.hash === hashCode && this._eq(node.key, key)) {
132
+ const oldValue = node.value;
133
+ node.value = value;
134
+ if (this._accessOrder) {
135
+ this.moveToEnd(node);
136
+ }
137
+ return oldValue;
138
+ }
139
+ node = node.next;
140
+ }
141
+ // Key doesn't exist, add new entry
142
+ const newNode = {
143
+ key,
144
+ value,
145
+ hash: hashCode,
146
+ next: this._buckets[index] ?? null,
147
+ before: null,
148
+ after: null,
149
+ };
150
+ this._buckets[index] = newNode;
151
+ this._size++;
152
+ // Add to linked list
153
+ this.addToEnd(newNode);
154
+ // Resize if needed
155
+ if (this._size > this._buckets.length * this._loadFactor) {
156
+ this.resize();
157
+ }
158
+ return undefined;
159
+ }
160
+ setIfAbsent(key, value) {
161
+ const existing = this.getNode(key);
162
+ if (existing !== null) {
163
+ if (this._accessOrder) {
164
+ this.moveToEnd(existing);
165
+ }
166
+ return existing.value;
167
+ }
168
+ this.set(key, value);
169
+ return value;
170
+ }
171
+ replace(key, value) {
172
+ const node = this.getNode(key);
173
+ if (node === null)
174
+ return undefined;
175
+ const oldValue = node.value;
176
+ node.value = value;
177
+ if (this._accessOrder) {
178
+ this.moveToEnd(node);
179
+ }
180
+ return oldValue;
181
+ }
182
+ replaceEntry(key, oldValue, newValue) {
183
+ const node = this.getNode(key);
184
+ if (node === null || !this._valueEq(node.value, oldValue)) {
185
+ return false;
186
+ }
187
+ node.value = newValue;
188
+ if (this._accessOrder) {
189
+ this.moveToEnd(node);
190
+ }
191
+ return true;
192
+ }
193
+ delete(key) {
194
+ const node = this.getNode(key);
195
+ if (node === null)
196
+ return undefined;
197
+ const oldValue = node.value;
198
+ // Remove from bucket
199
+ this.removeFromBucket(node);
200
+ // Remove from linked list
201
+ this.removeFromList(node);
202
+ this._size--;
203
+ return oldValue;
204
+ }
205
+ deleteEntry(key, value) {
206
+ const node = this.getNode(key);
207
+ if (node === null || !this._valueEq(node.value, value)) {
208
+ return false;
209
+ }
210
+ // Remove from bucket
211
+ this.removeFromBucket(node);
212
+ // Remove from linked list
213
+ this.removeFromList(node);
214
+ this._size--;
215
+ return true;
216
+ }
217
+ clear() {
218
+ this._buckets = new Array(this._buckets.length).fill(null);
219
+ this._size = 0;
220
+ this._head = null;
221
+ this._tail = null;
222
+ }
223
+ // ========================================================================
224
+ // Bulk operations
225
+ // ========================================================================
226
+ putAll(other) {
227
+ if ('entries' in other && typeof other.entries === 'function') {
228
+ for (const entry of other.entries()) {
229
+ this.set(entry.key, entry.value);
230
+ }
231
+ }
232
+ else {
233
+ for (const entry of other) {
234
+ this.set(entry.key, entry.value);
235
+ }
236
+ }
237
+ }
238
+ // ========================================================================
239
+ // Computed operations
240
+ // ========================================================================
241
+ computeIfAbsent(key, mappingFunction) {
242
+ const existing = this.getNode(key);
243
+ if (existing !== null) {
244
+ if (this._accessOrder) {
245
+ this.moveToEnd(existing);
246
+ }
247
+ return existing.value;
248
+ }
249
+ const value = mappingFunction(key);
250
+ this.set(key, value);
251
+ return value;
252
+ }
253
+ computeIfPresent(key, remappingFunction) {
254
+ const existing = this.getNode(key);
255
+ if (existing === null)
256
+ return undefined;
257
+ const newValue = remappingFunction(key, existing.value);
258
+ if (newValue === undefined) {
259
+ this.delete(key);
260
+ return undefined;
261
+ }
262
+ existing.value = newValue;
263
+ if (this._accessOrder) {
264
+ this.moveToEnd(existing);
265
+ }
266
+ return newValue;
267
+ }
268
+ compute(key, remappingFunction) {
269
+ const existing = this.getNode(key);
270
+ const newValue = remappingFunction(key, existing?.value);
271
+ if (newValue === undefined) {
272
+ if (existing !== null) {
273
+ this.delete(key);
274
+ }
275
+ return undefined;
276
+ }
277
+ this.set(key, newValue);
278
+ return newValue;
279
+ }
280
+ merge(key, value, remappingFunction) {
281
+ const existing = this.getNode(key);
282
+ if (existing === null) {
283
+ this.set(key, value);
284
+ return value;
285
+ }
286
+ const merged = remappingFunction(existing.value, value);
287
+ if (merged === undefined) {
288
+ this.delete(key);
289
+ return undefined;
290
+ }
291
+ existing.value = merged;
292
+ if (this._accessOrder) {
293
+ this.moveToEnd(existing);
294
+ }
295
+ return merged;
296
+ }
297
+ // ========================================================================
298
+ // View operations
299
+ // ========================================================================
300
+ *keys() {
301
+ let node = this._head;
302
+ while (node !== null) {
303
+ yield node.key;
304
+ node = node.after;
305
+ }
306
+ }
307
+ *values() {
308
+ let node = this._head;
309
+ while (node !== null) {
310
+ yield node.value;
311
+ node = node.after;
312
+ }
313
+ }
314
+ *entries() {
315
+ let node = this._head;
316
+ while (node !== null) {
317
+ yield { key: node.key, value: node.value };
318
+ node = node.after;
319
+ }
320
+ }
321
+ *[Symbol.iterator]() {
322
+ yield* this.entries();
323
+ }
324
+ forEach(action) {
325
+ for (const entry of this.entries()) {
326
+ action(entry.value, entry.key, this);
327
+ }
328
+ }
329
+ toArray() {
330
+ return Array.from(this.entries());
331
+ }
332
+ // ========================================================================
333
+ // Private helpers
334
+ // ========================================================================
335
+ getNode(key) {
336
+ const hashCode = this._hash(key);
337
+ const index = this.getBucketIndex(hashCode);
338
+ let node = this._buckets[index] ?? null;
339
+ while (node !== null) {
340
+ if (node.hash === hashCode && this._eq(node.key, key)) {
341
+ return node;
342
+ }
343
+ node = node.next;
344
+ }
345
+ return null;
346
+ }
347
+ getBucketIndex(hashCode) {
348
+ return Math.abs(hashCode) % this._buckets.length;
349
+ }
350
+ removeFromBucket(node) {
351
+ const index = this.getBucketIndex(node.hash);
352
+ let current = this._buckets[index] ?? null;
353
+ let prev = null;
354
+ while (current !== null) {
355
+ if (current === node) {
356
+ if (prev === null) {
357
+ this._buckets[index] = current.next;
358
+ }
359
+ else {
360
+ prev.next = current.next;
361
+ }
362
+ return;
363
+ }
364
+ prev = current;
365
+ current = current.next;
366
+ }
367
+ }
368
+ addToEnd(node) {
369
+ node.before = this._tail;
370
+ node.after = null;
371
+ if (this._tail === null)
372
+ this._head = node;
373
+ else
374
+ this._tail.after = node;
375
+ this._tail = node;
376
+ }
377
+ removeFromList(node) {
378
+ if (node.before !== null)
379
+ node.before.after = node.after;
380
+ else
381
+ this._head = node.after;
382
+ if (node.after !== null)
383
+ node.after.before = node.before;
384
+ else
385
+ this._tail = node.before;
386
+ node.before = node.after = null;
387
+ }
388
+ moveToEnd(node) {
389
+ if (node === this._tail)
390
+ return; // Already at end
391
+ this.removeFromList(node);
392
+ this.addToEnd(node);
393
+ }
394
+ resize() {
395
+ this._buckets = new Array(this._buckets.length * 2).fill(null);
396
+ // Rebuild the bucket chains (`next`) from the order list (`after`)
397
+ for (let node = this._head; node !== null; node = node.after) {
398
+ const index = this.getBucketIndex(node.hash);
399
+ node.next = this._buckets[index] ?? null;
400
+ this._buckets[index] = node;
401
+ }
402
+ }
403
+ // ========================================================================
404
+ // Utility methods
405
+ // ========================================================================
406
+ toString() {
407
+ const entries = Array.from(this.entries())
408
+ .map(({ key, value }) => `${key}=${value}`)
409
+ .join(', ');
410
+ return `LinkedHashMap{${entries}}`;
411
+ }
412
+ }
413
+ /**
414
+ * Factory function to create a LinkedHashMap.
415
+ *
416
+ * @example
417
+ * const map = linkedHashMap<string, number>()
418
+ * map.set('a', 1)
419
+ * map.set('b', 2)
420
+ *
421
+ * @example
422
+ * // With initial entries
423
+ * const map = linkedHashMap<string, number>([
424
+ * ['a', 1],
425
+ * ['b', 2]
426
+ * ])
427
+ *
428
+ * @example
429
+ * // LRU cache with access order
430
+ * const lru = linkedHashMap<string, number>({ accessOrder: true })
431
+ */
432
+ export function linkedHashMap(optionsOrEntries) {
433
+ if (optionsOrEntries && Symbol.iterator in optionsOrEntries) {
434
+ const map = new LinkedHashMap();
435
+ for (const [key, value] of optionsOrEntries) {
436
+ map.set(key, value);
437
+ }
438
+ return map;
439
+ }
440
+ return new LinkedHashMap(optionsOrEntries);
441
+ }
442
+ //# sourceMappingURL=linked-hash-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked-hash-map.js","sourceRoot":"","sources":["../../src/impl/linked-hash-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * LinkedList implementation - A doubly-linked list.
3
+ *
4
+ * Provides O(1) insertion/removal at both ends and at known positions.
5
+ * Slower random access O(n) compared to ArrayList.
6
+ * Mirrors java.util.LinkedList.
7
+ *
8
+ * @example
9
+ * const list = linkedList<number>()
10
+ * list.addFirst(1)
11
+ * list.addLast(2)
12
+ * list.add(3)
13
+ */
14
+ import type { List } from "../interfaces/list.js";
15
+ import type { Deque } from "../interfaces/queue.js";
16
+ import type { Eq, Compare } from "../core/traits.js";
17
+ /**
18
+ * Options for creating a LinkedList.
19
+ */
20
+ export interface LinkedListOptions<T> {
21
+ /**
22
+ * Equality function for comparing elements.
23
+ * @default defaultEq (===)
24
+ */
25
+ eq?: Eq<T>;
26
+ }
27
+ /**
28
+ * LinkedList<T> - Doubly-linked list implementation.
29
+ *
30
+ * Efficient for:
31
+ * - Insertion/removal at ends: O(1)
32
+ * - Insertion/removal at known position: O(1)
33
+ * - Sequential iteration: O(n)
34
+ *
35
+ * Not efficient for:
36
+ * - Random access by index: O(n)
37
+ * - Search: O(n)
38
+ *
39
+ * Implements both List and Deque interfaces.
40
+ */
41
+ export declare class LinkedList<T> implements List<T>, Deque<T> {
42
+ private _head;
43
+ private _tail;
44
+ private _size;
45
+ private readonly _eq;
46
+ constructor(options?: LinkedListOptions<T>);
47
+ get size(): number;
48
+ get isEmpty(): boolean;
49
+ get eq(): Eq<T>;
50
+ addFirst(element: T): void;
51
+ addLast(element: T): void;
52
+ removeFirst(): T;
53
+ removeLast(): T;
54
+ pollFirst(): T | undefined;
55
+ pollLast(): T | undefined;
56
+ peekFirst(): T;
57
+ peekLast(): T;
58
+ peekFirstOrUndefined(): T | undefined;
59
+ peekLastOrUndefined(): T | undefined;
60
+ offerFirst(element: T): boolean;
61
+ offerLast(element: T): boolean;
62
+ push(element: T): void;
63
+ pop(): T;
64
+ offer(element: T): boolean;
65
+ poll(): T;
66
+ peek(): T;
67
+ peekOrUndefined(): T | undefined;
68
+ pollOrUndefined(): T | undefined;
69
+ enqueue(element: T): boolean;
70
+ dequeue(): T;
71
+ get(index: number): T;
72
+ set(index: number, element: T): T;
73
+ insert(index: number, element: T): void;
74
+ insertAll(index: number, other: Iterable<T>): boolean;
75
+ removeAt(index: number): T;
76
+ removeRange(fromIndex: number, toIndex: number): void;
77
+ indexOf(element: T, fromIndex?: number): number;
78
+ lastIndexOf(element: T, fromIndex?: number): number;
79
+ first(): T;
80
+ last(): T;
81
+ shift(): T;
82
+ unshift(element: T): void;
83
+ add(element: T): boolean;
84
+ addAll(other: Iterable<T>): boolean;
85
+ contains(element: T): boolean;
86
+ containsAll(other: Iterable<T>): boolean;
87
+ remove(element: T): boolean;
88
+ removeAll(other: Iterable<T>): boolean;
89
+ retainAll(other: Iterable<T>): boolean;
90
+ clear(): void;
91
+ sort(compare?: Compare<T>): void;
92
+ reverse(): void;
93
+ subList(fromIndex: number, toIndex: number): List<T>;
94
+ [Symbol.iterator](): Iterator<T>;
95
+ forEach(action: (element: T, index: number) => void): void;
96
+ toArray(): T[];
97
+ private getNode;
98
+ private unlinkNode;
99
+ toString(): string;
100
+ }
101
+ /**
102
+ * Factory function to create a LinkedList.
103
+ *
104
+ * @example
105
+ * const list = linkedList<number>()
106
+ * const listFromArray = linkedList([1, 2, 3])
107
+ */
108
+ export declare function linkedList<T>(optionsOrElements?: LinkedListOptions<T> | Iterable<T>): LinkedList<T>;
109
+ //# sourceMappingURL=linked-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked-list.d.ts","sourceRoot":"","sources":["../../src/impl/linked-list.ts"],"names":[],"mappings":"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"}