typescript-dsa-stl 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **This is the GitHub repository** for the npm package **[typescript-dsa-stl](https://www.npmjs.com/package/typescript-dsa-stl)**.
4
4
 
5
- STL-style data structures and algorithms for TypeScript: **Vector**, **Stack**, **Queue**, **List**, **PriorityQueue**, **OrderedMap** (Map), **UnorderedMap**, **OrderedSet** (Set), **UnorderedSet**, and algorithms (`sort`, `binarySearch`, `lowerBound`, `min`, `max`, etc.). Install from npm to use in your project; this repo holds the source code.
5
+ STL-style data structures and algorithms for TypeScript: **Vector**, **Stack**, **Queue**, **List**, **PriorityQueue**, **OrderedMap** (Map), **UnorderedMap**, **OrderedSet** (Set), **UnorderedSet**, **OrderedMultiMap**, **OrderedMultiSet**, and algorithms (`sort`, `binarySearch`, `lowerBound`, `min`, `max`, etc.). Install from npm to use in your project; this repo holds the source code.
6
6
 
7
7
  ---
8
8
 
@@ -27,6 +27,8 @@ import {
27
27
  UnorderedMap,
28
28
  OrderedSet,
29
29
  UnorderedSet,
30
+ OrderedMultiMap,
31
+ OrderedMultiSet,
30
32
  sort,
31
33
  find,
32
34
  binarySearch,
@@ -72,6 +74,17 @@ console.log(map.get('a')); // 1
72
74
  const set = new UnorderedSet<number>([1, 2, 2, 3]);
73
75
  console.log(set.size); // 3
74
76
 
77
+ // OrderedMultiSet (sorted, duplicates allowed)
78
+ const multiSet = new OrderedMultiSet<number>();
79
+ multiSet.add(3); multiSet.add(1); multiSet.add(2); multiSet.add(2);
80
+ console.log(multiSet.toArray()); // [1, 2, 2, 3]
81
+ console.log(multiSet.count(2)); // 2
82
+
83
+ // OrderedMultiMap (one key → multiple values, keys sorted)
84
+ const multiMap = new OrderedMultiMap<string, number>();
85
+ multiMap.set('scores', 90); multiMap.set('scores', 85); multiMap.set('scores', 95);
86
+ console.log(multiMap.getAll('scores')); // [90, 85, 95]
87
+
75
88
  // Algorithms (work on arrays and iterables)
76
89
  const arr = [3, 1, 4, 1, 5];
77
90
  sort(arr); // [1, 1, 3, 4, 5]
@@ -137,7 +150,7 @@ cube.at(0).at(1).at(0); // 3 (layer 0, row 1, col 0)
137
150
 
138
151
  | Module | Exports |
139
152
  |--------|--------|
140
- | **Collections** | `Vector`, `Stack`, `Queue`, `List`, `ListNode`, `PriorityQueue`, `OrderedMap`, `UnorderedMap`, `OrderedSet`, `UnorderedSet` |
153
+ | **Collections** | `Vector`, `Stack`, `Queue`, `List`, `ListNode`, `PriorityQueue`, `OrderedMap`, `UnorderedMap`, `OrderedSet`, `UnorderedSet`, `OrderedMultiMap`, `OrderedMultiSet` |
141
154
  | **Algorithms** | `sort`, `find`, `findIndex`, `transform`, `filter`, `reduce`, `reverse`, `unique`, `binarySearch`, `lowerBound`, `upperBound`, `min`, `max`, `partition` |
142
155
  | **Utils** | `clamp`, `range`, `noop`, `identity`, `swap` |
143
156
  | **Types** | `Comparator`, `Predicate`, `UnaryFn`, `Reducer`, `IterableLike`, `toArray` |
@@ -166,12 +179,64 @@ import type { Comparator } from 'typescript-dsa-stl/types';
166
179
  | **UnorderedMap** | O(1)* get/set | O(1)* | — | O(1)* delete | — |
167
180
  | **OrderedSet** (Set) | O(log n) has | O(n) add | — | O(n) delete | — |
168
181
  | **UnorderedSet** | O(1)* has/add | O(1)* | — | O(1)* delete | — |
182
+ | **OrderedMultiMap** | O(log n) get | O(n) set | — | O(n) delete | — |
183
+ | **OrderedMultiSet** | O(log n) has/count | O(n) add | — | O(n) delete | — |
169
184
 
170
185
  \* Amortized (hash).
171
186
  \** At a known node.
172
187
 
173
188
  ---
174
189
 
190
+ ## OrderedMultiMap and OrderedMultiSet — use cases
191
+
192
+ **OrderedMultiSet** is a sorted collection that allows duplicate elements (like C++ `std::multiset`). Use it when you need ordering and multiple copies of the same value.
193
+
194
+ | Use case | Example |
195
+ |----------|---------|
196
+ | **Sorted runs / leaderboard with ties** | Store scores; multiple users can have the same score. Iterate in sorted order, use `count(score)` for ties. |
197
+ | **Event timeline with repeated timestamps** | Add events by time; several events can share the same time. `add(timestamp)`, iterate in order. |
198
+ | **K-th smallest in a multiset** | Keep elements sorted; k-th element is at index `k - 1` in iteration. |
199
+ | **Range counts** | Combined with binary search ideas: count elements in `[low, high]` using `count` and iteration. |
200
+
201
+ **OrderedMultiMap** maps one key to multiple values while keeping keys sorted (like C++ `std::multimap`). Use it when a key can have several associated values and you need key order.
202
+
203
+ | Use case | Example |
204
+ |----------|---------|
205
+ | **Inverted index** | Key = term, values = document IDs containing that term. `set(term, docId)` for each occurrence; `getAll(term)` returns all doc IDs. |
206
+ | **Grouping by key** | Key = category, values = items. `set(category, item)`; iterate keys in order, use `getAll(key)` per group. |
207
+ | **One-to-many relations** | Key = user ID, values = session IDs. `set(userId, sessionId)`; `getAll(userId)` lists all sessions. |
208
+ | **Time-series by bucket** | Key = time bucket, values = events. Sorted keys give chronological buckets; `getAll(bucket)` gets events in that bucket. |
209
+
210
+ ### OrderedMultiSet example
211
+
212
+ ```ts
213
+ import { OrderedMultiSet } from 'typescript-dsa-stl';
214
+
215
+ const scores = new OrderedMultiSet<number>();
216
+ scores.add(85); scores.add(92); scores.add(85); scores.add(78);
217
+ console.log(scores.toArray()); // [78, 85, 85, 92]
218
+ console.log(scores.count(85)); // 2
219
+ scores.delete(85); // remove one 85
220
+ console.log(scores.count(85)); // 1
221
+ scores.deleteAll(85); // remove all 85s
222
+ ```
223
+
224
+ ### OrderedMultiMap example
225
+
226
+ ```ts
227
+ import { OrderedMultiMap } from 'typescript-dsa-stl';
228
+
229
+ const index = new OrderedMultiMap<string, number>(); // term -> doc IDs
230
+ index.set('typescript', 1); index.set('typescript', 3); index.set('stl', 2);
231
+ console.log(index.getAll('typescript')); // [1, 3]
232
+ console.log(index.get('stl')); // 2
233
+ for (const [key, value] of index) {
234
+ console.log(key, value); // keys in sorted order
235
+ }
236
+ ```
237
+
238
+ ---
239
+
175
240
  ## For maintainers
176
241
 
177
242
  - **Build:** `npm run build` (also runs before `npm publish` via `prepublishOnly`)
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Ordered multimap (STL-style multimap). Keys sorted by comparator; one key can have multiple values.
3
+ * O(log n) get/has, O(n) set/delete. Implemented with a sorted array of [key, value] pairs.
4
+ */
5
+ import type { Comparator } from '../types/index.js';
6
+ export declare class OrderedMultiMap<K, V> {
7
+ private _entries;
8
+ private _compare;
9
+ constructor(compare?: Comparator<K>);
10
+ get size(): number;
11
+ get empty(): boolean;
12
+ private _lowerBound;
13
+ private _upperBound;
14
+ /** First value for key, or undefined. */
15
+ get(key: K): V | undefined;
16
+ /** All values for key (in order). */
17
+ getAll(key: K): V[];
18
+ /** Add a key-value pair (duplicate keys allowed). */
19
+ set(key: K, value: V): void;
20
+ has(key: K): boolean;
21
+ /** True if the pair (key, value) exists. */
22
+ hasEntry(key: K, value: V): boolean;
23
+ /** Number of pairs with this key. */
24
+ count(key: K): number;
25
+ /** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
26
+ delete(key: K, value?: V): boolean;
27
+ /** Remove all pairs for key. Returns count removed. */
28
+ deleteAll(key: K): number;
29
+ clear(): void;
30
+ keys(): Iterable<K>;
31
+ values(): Iterable<V>;
32
+ entries(): Iterable<[K, V]>;
33
+ [Symbol.iterator](): Iterator<[K, V]>;
34
+ }
35
+ //# sourceMappingURL=OrderedMultiMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedMultiMap.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMultiMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAInC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAYnB,yCAAyC;IACzC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAQ1B,qCAAqC;IACrC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;IAMnB,qDAAqD;IACrD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAK3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKpB,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO;IASnC,qCAAqC;IACrC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAIrB,qGAAqG;IACrG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,OAAO;IAiBlC,uDAAuD;IACvD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAQzB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC;IAInB,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIrB,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI3B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAGtC"}
@@ -0,0 +1,121 @@
1
+ function defaultCompare(a, b) {
2
+ return a < b ? -1 : a > b ? 1 : 0;
3
+ }
4
+ export class OrderedMultiMap {
5
+ constructor(compare) {
6
+ this._entries = [];
7
+ this._compare = compare ?? defaultCompare;
8
+ }
9
+ get size() {
10
+ return this._entries.length;
11
+ }
12
+ get empty() {
13
+ return this._entries.length === 0;
14
+ }
15
+ _lowerBound(key) {
16
+ const cmp = this._compare;
17
+ let lo = 0;
18
+ let hi = this._entries.length;
19
+ while (lo < hi) {
20
+ const mid = (lo + hi) >>> 1;
21
+ if (cmp(this._entries[mid][0], key) < 0)
22
+ lo = mid + 1;
23
+ else
24
+ hi = mid;
25
+ }
26
+ return lo;
27
+ }
28
+ _upperBound(key) {
29
+ const cmp = this._compare;
30
+ let lo = 0;
31
+ let hi = this._entries.length;
32
+ while (lo < hi) {
33
+ const mid = (lo + hi) >>> 1;
34
+ if (cmp(key, this._entries[mid][0]) < 0)
35
+ hi = mid;
36
+ else
37
+ lo = mid + 1;
38
+ }
39
+ return lo;
40
+ }
41
+ /** First value for key, or undefined. */
42
+ get(key) {
43
+ const i = this._lowerBound(key);
44
+ if (i < this._entries.length && this._compare(this._entries[i][0], key) === 0) {
45
+ return this._entries[i][1];
46
+ }
47
+ return undefined;
48
+ }
49
+ /** All values for key (in order). */
50
+ getAll(key) {
51
+ const lo = this._lowerBound(key);
52
+ const hi = this._upperBound(key);
53
+ return this._entries.slice(lo, hi).map((e) => e[1]);
54
+ }
55
+ /** Add a key-value pair (duplicate keys allowed). */
56
+ set(key, value) {
57
+ const i = this._lowerBound(key);
58
+ this._entries.splice(i, 0, [key, value]);
59
+ }
60
+ has(key) {
61
+ const i = this._lowerBound(key);
62
+ return i < this._entries.length && this._compare(this._entries[i][0], key) === 0;
63
+ }
64
+ /** True if the pair (key, value) exists. */
65
+ hasEntry(key, value) {
66
+ const lo = this._lowerBound(key);
67
+ const hi = this._upperBound(key);
68
+ for (let j = lo; j < hi; j++) {
69
+ if (this._entries[j][1] === value)
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ /** Number of pairs with this key. */
75
+ count(key) {
76
+ return this._upperBound(key) - this._lowerBound(key);
77
+ }
78
+ /** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
79
+ delete(key, value) {
80
+ const lo = this._lowerBound(key);
81
+ const hi = this._upperBound(key);
82
+ if (lo >= hi)
83
+ return false;
84
+ if (value !== undefined) {
85
+ for (let j = lo; j < hi; j++) {
86
+ if (this._entries[j][1] === value) {
87
+ this._entries.splice(j, 1);
88
+ return true;
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ this._entries.splice(lo, 1);
94
+ return true;
95
+ }
96
+ /** Remove all pairs for key. Returns count removed. */
97
+ deleteAll(key) {
98
+ const lo = this._lowerBound(key);
99
+ const hi = this._upperBound(key);
100
+ const removed = hi - lo;
101
+ if (removed > 0)
102
+ this._entries.splice(lo, removed);
103
+ return removed;
104
+ }
105
+ clear() {
106
+ this._entries.length = 0;
107
+ }
108
+ keys() {
109
+ return this._entries.map((e) => e[0]);
110
+ }
111
+ values() {
112
+ return this._entries.map((e) => e[1]);
113
+ }
114
+ entries() {
115
+ return this._entries;
116
+ }
117
+ [Symbol.iterator]() {
118
+ return this._entries[Symbol.iterator]();
119
+ }
120
+ }
121
+ //# sourceMappingURL=OrderedMultiMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedMultiMap.js","sourceRoot":"","sources":["../../src/collections/OrderedMultiMap.ts"],"names":[],"mappings":"AAMA,SAAS,cAAc,CAAI,CAAI,EAAE,CAAI;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,eAAe;IAI1B,YAAY,OAAuB;QAH3B,aAAQ,GAAa,EAAE,CAAC;QAI9B,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,cAAc,CAAC;IAC5C,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,WAAW,CAAC,GAAM;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;gBAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;gBACjD,EAAE,GAAG,GAAG,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,WAAW,CAAC,GAAM;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,EAAE,GAAG,GAAG,CAAC;;gBAC7C,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAC,GAAM;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qCAAqC;IACrC,MAAM,CAAC,GAAM;QACX,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,qDAAqD;IACrD,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,4CAA4C;IAC5C,QAAQ,CAAC,GAAM,EAAE,KAAQ;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,GAAM;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,qGAAqG;IACrG,MAAM,CAAC,GAAM,EAAE,KAAS;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,EAAE,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;oBAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,SAAS,CAAC,GAAM;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;QACxB,IAAI,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Ordered multiset (STL-style multiset). Elements sorted by comparator; duplicates allowed.
3
+ * O(log n) has/count, O(n) add/delete. Implemented with a sorted array and binary search.
4
+ */
5
+ import type { Comparator } from '../types/index.js';
6
+ export declare class OrderedMultiSet<T> {
7
+ private _data;
8
+ private _compare;
9
+ constructor(compare?: Comparator<T>);
10
+ get size(): number;
11
+ get empty(): boolean;
12
+ private _lowerBound;
13
+ private _upperBound;
14
+ has(value: T): boolean;
15
+ /** Number of elements equal to value. */
16
+ count(value: T): number;
17
+ /** Insert value (duplicates allowed). */
18
+ add(value: T): void;
19
+ /** Remove one occurrence of value. Returns true if removed. */
20
+ delete(value: T): boolean;
21
+ /** Remove all occurrences of value. Returns count removed. */
22
+ deleteAll(value: T): number;
23
+ clear(): void;
24
+ [Symbol.iterator](): Iterator<T>;
25
+ toArray(): T[];
26
+ }
27
+ //# sourceMappingURL=OrderedMultiSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedMultiSet.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMultiSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,qBAAa,eAAe,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAInC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAYnB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAKtB,yCAAyC;IACzC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAIvB,yCAAyC;IACzC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKnB,+DAA+D;IAC/D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IASzB,8DAA8D;IAC9D,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ3B,KAAK,IAAI,IAAI;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIhC,OAAO,IAAI,CAAC,EAAE;CAGf"}
@@ -0,0 +1,82 @@
1
+ function defaultCompare(a, b) {
2
+ return a < b ? -1 : a > b ? 1 : 0;
3
+ }
4
+ export class OrderedMultiSet {
5
+ constructor(compare) {
6
+ this._data = [];
7
+ this._compare = compare ?? defaultCompare;
8
+ }
9
+ get size() {
10
+ return this._data.length;
11
+ }
12
+ get empty() {
13
+ return this._data.length === 0;
14
+ }
15
+ _lowerBound(value) {
16
+ const cmp = this._compare;
17
+ let lo = 0;
18
+ let hi = this._data.length;
19
+ while (lo < hi) {
20
+ const mid = (lo + hi) >>> 1;
21
+ if (cmp(this._data[mid], value) < 0)
22
+ lo = mid + 1;
23
+ else
24
+ hi = mid;
25
+ }
26
+ return lo;
27
+ }
28
+ _upperBound(value) {
29
+ const cmp = this._compare;
30
+ let lo = 0;
31
+ let hi = this._data.length;
32
+ while (lo < hi) {
33
+ const mid = (lo + hi) >>> 1;
34
+ if (cmp(value, this._data[mid]) < 0)
35
+ hi = mid;
36
+ else
37
+ lo = mid + 1;
38
+ }
39
+ return lo;
40
+ }
41
+ has(value) {
42
+ const i = this._lowerBound(value);
43
+ return i < this._data.length && this._compare(this._data[i], value) === 0;
44
+ }
45
+ /** Number of elements equal to value. */
46
+ count(value) {
47
+ return this._upperBound(value) - this._lowerBound(value);
48
+ }
49
+ /** Insert value (duplicates allowed). */
50
+ add(value) {
51
+ const i = this._lowerBound(value);
52
+ this._data.splice(i, 0, value);
53
+ }
54
+ /** Remove one occurrence of value. Returns true if removed. */
55
+ delete(value) {
56
+ const i = this._lowerBound(value);
57
+ if (i < this._data.length && this._compare(this._data[i], value) === 0) {
58
+ this._data.splice(i, 1);
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+ /** Remove all occurrences of value. Returns count removed. */
64
+ deleteAll(value) {
65
+ const lo = this._lowerBound(value);
66
+ const hi = this._upperBound(value);
67
+ const removed = hi - lo;
68
+ if (removed > 0)
69
+ this._data.splice(lo, removed);
70
+ return removed;
71
+ }
72
+ clear() {
73
+ this._data.length = 0;
74
+ }
75
+ [Symbol.iterator]() {
76
+ return this._data[Symbol.iterator]();
77
+ }
78
+ toArray() {
79
+ return [...this._data];
80
+ }
81
+ }
82
+ //# sourceMappingURL=OrderedMultiSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedMultiSet.js","sourceRoot":"","sources":["../../src/collections/OrderedMultiSet.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,6 @@ export { OrderedMap } from './OrderedMap.js';
7
7
  export { UnorderedMap } from './UnorderedMap.js';
8
8
  export { OrderedSet } from './OrderedSet.js';
9
9
  export { UnorderedSet } from './UnorderedSet.js';
10
+ export { OrderedMultiSet } from './OrderedMultiSet.js';
11
+ export { OrderedMultiMap } from './OrderedMultiMap.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -7,4 +7,6 @@ export { OrderedMap } from './OrderedMap.js';
7
7
  export { UnorderedMap } from './UnorderedMap.js';
8
8
  export { OrderedSet } from './OrderedSet.js';
9
9
  export { UnorderedSet } from './UnorderedSet.js';
10
+ export { OrderedMultiSet } from './OrderedMultiSet.js';
11
+ export { OrderedMultiMap } from './OrderedMultiMap.js';
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * @example
6
6
  * import { Vector, Stack, Queue, List, sort, binarySearch, clamp } from 'typescript-dsa-stl';
7
7
  */
8
- export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, } from './collections/index.js';
8
+ export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, OrderedMultiSet, OrderedMultiMap, } from './collections/index.js';
9
9
  export { sort, find, findIndex, transform, filter, reduce, reverse, unique, binarySearch, lowerBound, upperBound, min, max, partition, } from './algorithms/index.js';
10
10
  export { clamp, range, noop, identity, swap } from './utils/index.js';
11
11
  export type { Comparator, Predicate, UnaryFn, Reducer, IterableLike } from './types/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * @example
6
6
  * import { Vector, Stack, Queue, List, sort, binarySearch, clamp } from 'typescript-dsa-stl';
7
7
  */
8
- export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, } from './collections/index.js';
8
+ export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, OrderedMultiSet, OrderedMultiMap, } from './collections/index.js';
9
9
  export { sort, find, findIndex, transform, filter, reduce, reverse, unique, binarySearch, lowerBound, upperBound, min, max, partition, } from './algorithms/index.js';
10
10
  export { clamp, range, noop, identity, swap } from './utils/index.js';
11
11
  export { toArray } from './types/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typescript-dsa-stl",
3
- "version": "1.2.3",
3
+ "version": "1.3.0",
4
4
  "description": "STL-style data structures and algorithms for TypeScript: Vector, Stack, Queue, List, PriorityQueue, Map, Set, sort, binarySearch. Use like C++ STL.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -58,6 +58,10 @@
58
58
  "set",
59
59
  "ordered-map",
60
60
  "unordered-map",
61
+ "ordered-multimap",
62
+ "ordered-multiset",
63
+ "multimap",
64
+ "multiset",
61
65
  "binary-search",
62
66
  "collections",
63
67
  "sdk"