@matter/general 0.17.6 → 0.17.7-alpha.0-20260720-00d9d6fbf

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.
@@ -16,7 +16,9 @@ import { Observable } from "./Observable.js";
16
16
  *
17
17
  * * O(log(n)) enqueue and dequeue
18
18
  *
19
- * * O(1) deletion of arbitrary position, but will add expense of maintaining index of positions
19
+ * * Holds each item at most once (a priority set); re-adding a queued item is a no-op
20
+ *
21
+ * * O(1) lookup + O(log(n)) removal of an arbitrary item via a maintained position index
20
22
  *
21
23
  * * {@link added}, {@link deleted} and {@link firstChanged} events
22
24
  */
@@ -62,10 +64,7 @@ export declare class Heap<T> {
62
64
  */
63
65
  add(...items: T[]): void;
64
66
  /**
65
- * Delete an item.
66
- *
67
- * The first delete is O(n); subsequent deletes are O(1) but insertions and deletions will have additional cost
68
- * associated.
67
+ * Delete an item. Returns false if the item is not present.
69
68
  */
70
69
  delete(item: T): boolean;
71
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Heap.d.ts","sourceRoot":"","sources":["../../../src/util/Heap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,IAAI,CAAC,CAAC;;IAYf;;;;;OAKG;IACH,YAAY,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAG3E;IAED;;OAEG;IACH,KAAK,kBASJ;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAED;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,OAAO,YAEV;IAED;;OAEG;IACH,IAAI,YAAY,sCAKf;IAED;;OAEG;IACH,IAAI,KAAK,0BAKR;IAED;;OAEG;IACH,IAAI,OAAO,0BAKV;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,QAWhB;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,WAuBb;IAED;;OAEG;IACH,KAAK,SAEJ;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,0DAgCjC;IAED;;OAEG;IACH,QAAQ,SA0BP;CAkGJ"}
1
+ {"version":3,"file":"Heap.d.ts","sourceRoot":"","sources":["../../../src/util/Heap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,IAAI,CAAC,CAAC;;IAYf;;;;;OAKG;IACH,YAAY,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAG3E;IAED;;OAEG;IACH,KAAK,kBASJ;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAED;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,OAAO,YAEV;IAED;;OAEG;IACH,IAAI,YAAY,sCAKf;IAED;;OAEG;IACH,IAAI,KAAK,0BAKR;IAED;;OAEG;IACH,IAAI,OAAO,0BAKV;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,QAoBhB;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,WAYb;IAED;;OAEG;IACH,KAAK,SAGJ;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,0DAgCjC;IAED;;OAEG;IACH,QAAQ,SA0BP;CAgGJ"}
@@ -38,7 +38,7 @@ class Heap {
38
38
  #firstChanged;
39
39
  #deleted;
40
40
  #added;
41
- #positions;
41
+ #positions = /* @__PURE__ */ new Map();
42
42
  /**
43
43
  * Create new heap.
44
44
  *
@@ -76,7 +76,7 @@ class Heap {
76
76
  * Is the heap empty?
77
77
  */
78
78
  get isEmpty() {
79
- return !!this.#buffer.length;
79
+ return !this.#buffer.length;
80
80
  }
81
81
  /**
82
82
  * Emits when the head of the queue changes.
@@ -113,27 +113,19 @@ class Heap {
113
113
  if (this.#normalize) {
114
114
  item = this.#normalize(item);
115
115
  }
116
+ if (this.#positions.has(item)) {
117
+ continue;
118
+ }
116
119
  this.#buffer.push(item);
117
- this.#bubbleUp(this.#buffer.length - 1);
120
+ const index = this.#bubbleUp(this.#buffer.length - 1);
121
+ this.#positions.set(item, index);
118
122
  this.#added?.emit(item);
119
123
  }
120
124
  }
121
125
  /**
122
- * Delete an item.
123
- *
124
- * The first delete is O(n); subsequent deletes are O(1) but insertions and deletions will have additional cost
125
- * associated.
126
+ * Delete an item. Returns false if the item is not present.
126
127
  */
127
128
  delete(item) {
128
- if (this.#buffer === void 0) {
129
- return false;
130
- }
131
- if (!this.#positions) {
132
- this.#positions = /* @__PURE__ */ new Map();
133
- for (let i = 0; i < this.#buffer.length; i++) {
134
- this.#positions.set(this.#buffer[i], i);
135
- }
136
- }
137
129
  if (this.#normalize) {
138
130
  item = this.#normalize(item);
139
131
  }
@@ -149,6 +141,7 @@ class Heap {
149
141
  */
150
142
  clear() {
151
143
  if (this.#buffer.length) this.#buffer.length = 0;
144
+ this.#positions.clear();
152
145
  }
153
146
  /**
154
147
  * Stream the first value from the heap until aborted.
@@ -215,7 +208,7 @@ class Heap {
215
208
  } else {
216
209
  const lastIndex = this.#buffer.length - 1;
217
210
  this.#buffer[index] = this.#buffer[lastIndex];
218
- this.#positions?.set(this.#buffer[index], index);
211
+ this.#positions.set(this.#buffer[index], index);
219
212
  this.#buffer.length = lastIndex;
220
213
  if (index < this.#buffer.length) {
221
214
  if (index) {
@@ -224,7 +217,7 @@ class Heap {
224
217
  this.#sinkDown(index);
225
218
  }
226
219
  }
227
- this.#positions?.delete(item);
220
+ this.#positions.delete(item);
228
221
  this.#deleted?.emit(item);
229
222
  if (!index) {
230
223
  this.#firstChanged?.emit(this.first);
@@ -268,10 +261,8 @@ class Heap {
268
261
  }
269
262
  #swap(index1, index2) {
270
263
  [this.#buffer[index1], this.#buffer[index2]] = [this.#buffer[index2], this.#buffer[index1]];
271
- if (this.#positions) {
272
- this.#positions.set(this.#buffer[index1], index1);
273
- this.#positions.set(this.#buffer[index2], index2);
274
- }
264
+ this.#positions.set(this.#buffer[index1], index1);
265
+ this.#positions.set(this.#buffer[index2], index2);
275
266
  }
276
267
  #leftChildOf(index) {
277
268
  return 2 * index + 1;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Heap.ts"],
4
- "mappings": "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",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,yBAA8B;AAC9B,mBAAsB;AACtB,wBAA2B;AAR3B;AAAA;AAAA;AAAA;AAAA;AA2BO,MAAM,KAAQ;AAAA;AAAA;AAAA,EAGR,UAAU,MAAS;AAAA,EAEnB;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACS,aAAa,oBAAI,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,YAAY,YAAoC,YAA8B;AAC1E,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACJ,QAAI,CAAC,KAAK,SAAS,QAAQ;AACvB,aAAO;AAAA,IACX;AACA,UAAM,SAAS,KAAK;AAEpB,SAAK,UAAU,CAAC;AAEhB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAuB;AACvB,WAAO,KAAK,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAO;AACP,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACV,WAAO,CAAC,KAAK,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACf,QAAI,CAAC,KAAK,eAAe;AACrB,WAAK,gBAAgB,IAAI,6BAAW;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACR,QAAI,CAAC,KAAK,QAAQ;AACd,WAAK,SAAS,IAAI,6BAAW;AAAA,IACjC;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACV,QAAI,CAAC,KAAK,UAAU;AAChB,WAAK,WAAW,IAAI,6BAAW;AAAA,IACnC;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAY;AACf,aAAS,QAAQ,OAAO;AACpB,UAAI,KAAK,YAAY;AACjB,eAAO,KAAK,WAAW,IAAI;AAAA,MAC/B;AAIA,UAAI,KAAK,WAAW,IAAI,IAAI,GAAG;AAC3B;AAAA,MACJ;AAEA,WAAK,QAAQ,KAAK,IAAI;AAGtB,YAAM,QAAQ,KAAK,UAAU,KAAK,QAAQ,SAAS,CAAC;AACpD,WAAK,WAAW,IAAI,MAAM,KAAK;AAE/B,WAAK,QAAQ,KAAK,IAAI;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAS;AACZ,QAAI,KAAK,YAAY;AACjB,aAAO,KAAK,WAAW,IAAI;AAAA,IAC/B;AAEA,UAAM,MAAM,KAAK,WAAW,IAAI,IAAI;AACpC,QAAI,QAAQ,QAAW;AACnB,aAAO;AAAA,IACX;AAEA,SAAK,UAAU,GAAG;AAClB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACJ,QAAI,KAAK,QAAQ,OAAQ,MAAK,QAAQ,SAAS;AAC/C,SAAK,WAAW,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,OAAsB;AAChC,QAAI,mBAAM,GAAG,KAAK,GAAG;AACjB;AAAA,IACJ;AAEA,WAAO,MAAM;AAET,aAAO,KAAK,MAAM;AACd,cAAM,KAAK,MAAM;AAEjB,YAAI,mBAAM,GAAG,KAAK,GAAG;AACjB;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI;AACJ,YAAM,QAAQ,IAAI,QAAc,OAAM,UAAU,CAAE;AAGlD,UAAI;AACA,aAAK,MAAM,KAAK,OAAO;AAEvB,cAAM,mBAAM,KAAK,OAAO,KAAK;AAE7B,YAAI,mBAAM,GAAG,KAAK,GAAG;AACjB;AAAA,QACJ;AAAA,MACJ,UAAE;AACE,aAAK,MAAM,IAAI,OAAO;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC1C,YAAM,YAAY,KAAK,aAAa,CAAC;AACrC,UAAI,YAAY,KAAK,QAAQ,QAAQ;AACjC,YAAI,KAAK,SAAS,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ,SAAS,CAAC,IAAI,GAAG;AAC7D,gBAAM,IAAI;AAAA,YACN,uBAAuB,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,iCAAiC,SAAS,KAAK,KAAK,QAAQ,SAAS,CAAC;AAAA,UACtH;AAAA,QACJ;AAEA,cAAM,aAAa,KAAK,cAAc,CAAC;AACvC,YAAI,aAAa,KAAK,QAAQ,QAAQ;AAClC,cAAI,KAAK,SAAS,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ,UAAU,CAAC,IAAI,GAAG;AAC9D,kBAAM,IAAI;AAAA,cACN,uBAAuB,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,kCAAkC,UAAU,KAAK,KAAK,QAAQ,UAAU,CAAC;AAAA,YACzH;AAAA,UACJ;AAEA,cAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,UAAU,CAAC,IAAI,GAAG;AACtE,kBAAM,IAAI;AAAA,cACN,uBAAuB,SAAS,KAAK,KAAK,QAAQ,SAAS,CAAC,oCAAoC,UAAU,KAAK,KAAK,QAAQ,UAAU,CAAC;AAAA,YAC3I;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,UAAU,OAAe;AACrB,QAAI,SAAS,KAAK,QAAQ,QAAQ;AAC9B;AAAA,IACJ;AAEA,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC3B,WAAK,QAAQ,SAAS;AAAA,IAC1B,OAAO;AACH,YAAM,YAAY,KAAK,QAAQ,SAAS;AACxC,WAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,SAAS;AAC5C,WAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,GAAG,KAAK;AAC9C,WAAK,QAAQ,SAAS;AACtB,UAAI,QAAQ,KAAK,QAAQ,QAAQ;AAC7B,YAAI,OAAO;AACP,kBAAQ,KAAK,UAAU,KAAK;AAAA,QAChC;AACA,aAAK,UAAU,KAAK;AAAA,MACxB;AAAA,IACJ;AAEA,SAAK,WAAW,OAAO,IAAI;AAE3B,SAAK,UAAU,KAAK,IAAI;AACxB,QAAI,CAAC,OAAO;AACR,WAAK,eAAe,KAAK,KAAK,KAAK;AAAA,IACvC;AAAA,EACJ;AAAA,EAEA,UAAU,OAAe;AACrB,WAAO,MAAM;AACT,UAAI;AAEJ,YAAM,YAAY,KAAK,aAAa,KAAK;AAEzC,UAAI,YAAY,KAAK,QAAQ,QAAQ;AACjC,YAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,SAAS,CAAC,IAAI,GAAG;AACjE,mBAAS;AAAA,QACb;AAEA,cAAM,aAAa,KAAK,cAAc,KAAK;AAE3C,YAAI,aAAa,KAAK,QAAQ,QAAQ;AAClC,cAAI,KAAK,SAAS,KAAK,QAAQ,UAAU,KAAK,GAAG,KAAK,QAAQ,UAAU,CAAC,IAAI,GAAG;AAC5E,qBAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,WAAW,QAAW;AACtB;AAAA,MACJ;AAEA,WAAK,MAAM,OAAO,MAAM;AACxB,cAAQ;AAAA,IACZ;AAAA,EACJ;AAAA,EAEA,UAAU,OAAe;AACrB,WAAO,OAAO;AACV,YAAM,SAAS,KAAK,UAAU,KAAK;AAEnC,UAAI,KAAK,SAAS,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,KAAK,CAAC,KAAK,GAAG;AAC/D;AAAA,MACJ;AAEA,WAAK,MAAM,OAAO,MAAM;AACxB,cAAQ;AAAA,IACZ;AAEA,QAAI,CAAC,OAAO;AACR,WAAK,eAAe,KAAK,KAAK,KAAK;AAAA,IACvC;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,QAAgB,QAAgB;AAClC,KAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,MAAM,CAAC;AAC1F,SAAK,WAAW,IAAI,KAAK,QAAQ,MAAM,GAAG,MAAM;AAChD,SAAK,WAAW,IAAI,KAAK,QAAQ,MAAM,GAAG,MAAM;AAAA,EACpD;AAAA,EAEA,aAAa,OAAe;AACxB,WAAO,IAAI,QAAQ;AAAA,EACvB;AAAA,EAEA,cAAc,OAAe;AACzB,WAAO,IAAI,QAAQ;AAAA,EACvB;AAAA,EAEA,UAAU,OAAe;AACrB,WAAO,KAAK,OAAO,QAAQ,KAAK,CAAC;AAAA,EACrC;AACJ;",
5
5
  "names": []
6
6
  }
@@ -16,7 +16,9 @@ import { Observable } from "./Observable.js";
16
16
  *
17
17
  * * O(log(n)) enqueue and dequeue
18
18
  *
19
- * * O(1) deletion of arbitrary position, but will add expense of maintaining index of positions
19
+ * * Holds each item at most once (a priority set); re-adding a queued item is a no-op
20
+ *
21
+ * * O(1) lookup + O(log(n)) removal of an arbitrary item via a maintained position index
20
22
  *
21
23
  * * {@link added}, {@link deleted} and {@link firstChanged} events
22
24
  */
@@ -62,10 +64,7 @@ export declare class Heap<T> {
62
64
  */
63
65
  add(...items: T[]): void;
64
66
  /**
65
- * Delete an item.
66
- *
67
- * The first delete is O(n); subsequent deletes are O(1) but insertions and deletions will have additional cost
68
- * associated.
67
+ * Delete an item. Returns false if the item is not present.
69
68
  */
70
69
  delete(item: T): boolean;
71
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Heap.d.ts","sourceRoot":"","sources":["../../../src/util/Heap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,IAAI,CAAC,CAAC;;IAYf;;;;;OAKG;IACH,YAAY,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAG3E;IAED;;OAEG;IACH,KAAK,kBASJ;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAED;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,OAAO,YAEV;IAED;;OAEG;IACH,IAAI,YAAY,sCAKf;IAED;;OAEG;IACH,IAAI,KAAK,0BAKR;IAED;;OAEG;IACH,IAAI,OAAO,0BAKV;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,QAWhB;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,WAuBb;IAED;;OAEG;IACH,KAAK,SAEJ;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,0DAgCjC;IAED;;OAEG;IACH,QAAQ,SA0BP;CAkGJ"}
1
+ {"version":3,"file":"Heap.d.ts","sourceRoot":"","sources":["../../../src/util/Heap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,IAAI,CAAC,CAAC;;IAYf;;;;;OAKG;IACH,YAAY,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAG3E;IAED;;OAEG;IACH,KAAK,kBASJ;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAED;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,OAAO,YAEV;IAED;;OAEG;IACH,IAAI,YAAY,sCAKf;IAED;;OAEG;IACH,IAAI,KAAK,0BAKR;IAED;;OAEG;IACH,IAAI,OAAO,0BAKV;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,QAoBhB;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,WAYb;IAED;;OAEG;IACH,KAAK,SAGJ;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,0DAgCjC;IAED;;OAEG;IACH,QAAQ,SA0BP;CAgGJ"}
@@ -15,7 +15,7 @@ class Heap {
15
15
  #firstChanged;
16
16
  #deleted;
17
17
  #added;
18
- #positions;
18
+ #positions = /* @__PURE__ */ new Map();
19
19
  /**
20
20
  * Create new heap.
21
21
  *
@@ -53,7 +53,7 @@ class Heap {
53
53
  * Is the heap empty?
54
54
  */
55
55
  get isEmpty() {
56
- return !!this.#buffer.length;
56
+ return !this.#buffer.length;
57
57
  }
58
58
  /**
59
59
  * Emits when the head of the queue changes.
@@ -90,27 +90,19 @@ class Heap {
90
90
  if (this.#normalize) {
91
91
  item = this.#normalize(item);
92
92
  }
93
+ if (this.#positions.has(item)) {
94
+ continue;
95
+ }
93
96
  this.#buffer.push(item);
94
- this.#bubbleUp(this.#buffer.length - 1);
97
+ const index = this.#bubbleUp(this.#buffer.length - 1);
98
+ this.#positions.set(item, index);
95
99
  this.#added?.emit(item);
96
100
  }
97
101
  }
98
102
  /**
99
- * Delete an item.
100
- *
101
- * The first delete is O(n); subsequent deletes are O(1) but insertions and deletions will have additional cost
102
- * associated.
103
+ * Delete an item. Returns false if the item is not present.
103
104
  */
104
105
  delete(item) {
105
- if (this.#buffer === void 0) {
106
- return false;
107
- }
108
- if (!this.#positions) {
109
- this.#positions = /* @__PURE__ */ new Map();
110
- for (let i = 0; i < this.#buffer.length; i++) {
111
- this.#positions.set(this.#buffer[i], i);
112
- }
113
- }
114
106
  if (this.#normalize) {
115
107
  item = this.#normalize(item);
116
108
  }
@@ -126,6 +118,7 @@ class Heap {
126
118
  */
127
119
  clear() {
128
120
  if (this.#buffer.length) this.#buffer.length = 0;
121
+ this.#positions.clear();
129
122
  }
130
123
  /**
131
124
  * Stream the first value from the heap until aborted.
@@ -192,7 +185,7 @@ class Heap {
192
185
  } else {
193
186
  const lastIndex = this.#buffer.length - 1;
194
187
  this.#buffer[index] = this.#buffer[lastIndex];
195
- this.#positions?.set(this.#buffer[index], index);
188
+ this.#positions.set(this.#buffer[index], index);
196
189
  this.#buffer.length = lastIndex;
197
190
  if (index < this.#buffer.length) {
198
191
  if (index) {
@@ -201,7 +194,7 @@ class Heap {
201
194
  this.#sinkDown(index);
202
195
  }
203
196
  }
204
- this.#positions?.delete(item);
197
+ this.#positions.delete(item);
205
198
  this.#deleted?.emit(item);
206
199
  if (!index) {
207
200
  this.#firstChanged?.emit(this.first);
@@ -245,10 +238,8 @@ class Heap {
245
238
  }
246
239
  #swap(index1, index2) {
247
240
  [this.#buffer[index1], this.#buffer[index2]] = [this.#buffer[index2], this.#buffer[index1]];
248
- if (this.#positions) {
249
- this.#positions.set(this.#buffer[index1], index1);
250
- this.#positions.set(this.#buffer[index2], index2);
251
- }
241
+ this.#positions.set(this.#buffer[index1], index1);
242
+ this.#positions.set(this.#buffer[index2], index2);
252
243
  }
253
244
  #leftChildOf(index) {
254
245
  return 2 * index + 1;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Heap.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.17.6",
3
+ "version": "0.17.7-alpha.0-20260720-00d9d6fbf",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -35,7 +35,7 @@
35
35
  "@noble/curves": "^2.2.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@matter/testing": "0.17.6"
38
+ "@matter/testing": "0.17.7-alpha.0-20260720-00d9d6fbf"
39
39
  },
40
40
  "files": [
41
41
  "dist/**/*",
package/src/util/Heap.ts CHANGED
@@ -19,7 +19,9 @@ import { Observable } from "./Observable.js";
19
19
  *
20
20
  * * O(log(n)) enqueue and dequeue
21
21
  *
22
- * * O(1) deletion of arbitrary position, but will add expense of maintaining index of positions
22
+ * * Holds each item at most once (a priority set); re-adding a queued item is a no-op
23
+ *
24
+ * * O(1) lookup + O(log(n)) removal of an arbitrary item via a maintained position index
23
25
  *
24
26
  * * {@link added}, {@link deleted} and {@link firstChanged} events
25
27
  */
@@ -33,7 +35,7 @@ export class Heap<T> {
33
35
  #firstChanged?: Observable<[T | undefined]>;
34
36
  #deleted?: Observable<[T]>;
35
37
  #added?: Observable<[T]>;
36
- #positions?: Map<T, number>;
38
+ readonly #positions = new Map<T, number>();
37
39
 
38
40
  /**
39
41
  * Create new heap.
@@ -78,7 +80,7 @@ export class Heap<T> {
78
80
  * Is the heap empty?
79
81
  */
80
82
  get isEmpty() {
81
- return !!this.#buffer.length;
83
+ return !this.#buffer.length;
82
84
  }
83
85
 
84
86
  /**
@@ -120,31 +122,26 @@ export class Heap<T> {
120
122
  item = this.#normalize(item);
121
123
  }
122
124
 
125
+ // The heap holds each item at most once; a re-add of a queued item is a no-op. #positions maps an item
126
+ // to a single index, so a second copy could not be tracked and would orphan on delete.
127
+ if (this.#positions.has(item)) {
128
+ continue;
129
+ }
130
+
123
131
  this.#buffer.push(item);
124
- this.#bubbleUp(this.#buffer.length - 1);
132
+ // #bubbleUp updates positions for elements it swaps; record the final resting index for the item itself,
133
+ // which is the only element not covered when it does not move.
134
+ const index = this.#bubbleUp(this.#buffer.length - 1);
135
+ this.#positions.set(item, index);
125
136
 
126
137
  this.#added?.emit(item);
127
138
  }
128
139
  }
129
140
 
130
141
  /**
131
- * Delete an item.
132
- *
133
- * The first delete is O(n); subsequent deletes are O(1) but insertions and deletions will have additional cost
134
- * associated.
142
+ * Delete an item. Returns false if the item is not present.
135
143
  */
136
144
  delete(item: T) {
137
- if (this.#buffer === undefined) {
138
- return false;
139
- }
140
-
141
- if (!this.#positions) {
142
- this.#positions = new Map();
143
- for (let i = 0; i < this.#buffer.length; i++) {
144
- this.#positions.set(this.#buffer[i], i);
145
- }
146
- }
147
-
148
145
  if (this.#normalize) {
149
146
  item = this.#normalize(item);
150
147
  }
@@ -163,6 +160,7 @@ export class Heap<T> {
163
160
  */
164
161
  clear() {
165
162
  if (this.#buffer.length) this.#buffer.length = 0;
163
+ this.#positions.clear();
166
164
  }
167
165
 
168
166
  /**
@@ -244,7 +242,7 @@ export class Heap<T> {
244
242
  } else {
245
243
  const lastIndex = this.#buffer.length - 1;
246
244
  this.#buffer[index] = this.#buffer[lastIndex];
247
- this.#positions?.set(this.#buffer[index], index);
245
+ this.#positions.set(this.#buffer[index], index);
248
246
  this.#buffer.length = lastIndex;
249
247
  if (index < this.#buffer.length) {
250
248
  if (index) {
@@ -254,7 +252,7 @@ export class Heap<T> {
254
252
  }
255
253
  }
256
254
 
257
- this.#positions?.delete(item);
255
+ this.#positions.delete(item);
258
256
 
259
257
  this.#deleted?.emit(item);
260
258
  if (!index) {
@@ -312,10 +310,8 @@ export class Heap<T> {
312
310
 
313
311
  #swap(index1: number, index2: number) {
314
312
  [this.#buffer[index1], this.#buffer[index2]] = [this.#buffer[index2], this.#buffer[index1]];
315
- if (this.#positions) {
316
- this.#positions.set(this.#buffer[index1], index1);
317
- this.#positions.set(this.#buffer[index2], index2);
318
- }
313
+ this.#positions.set(this.#buffer[index1], index1);
314
+ this.#positions.set(this.#buffer[index2], index2);
319
315
  }
320
316
 
321
317
  #leftChildOf(index: number) {