@oimdb/core 3.8.0 → 3.10.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/dist/index.js CHANGED
@@ -550,7 +550,7 @@ var OIMIndexArrayBased = class extends OIMIndex {
550
550
 
551
551
  // src/core/OIMCarrierKeyedEmitter.ts
552
552
  var OIMCarrierKeyedEmitter = class {
553
- constructor(queue, resolver) {
553
+ constructor(queue, carrierProvider) {
554
554
  // Carriers with at least one subscriber — for markAllUpdated / metrics.
555
555
  this.subscribedCarriers = /* @__PURE__ */ new Set();
556
556
  // Pending flush batch. A plain array + a `carrier.dirty` flag for dedup —
@@ -575,17 +575,17 @@ var OIMCarrierKeyedEmitter = class {
575
575
  }
576
576
  };
577
577
  this.queue = queue;
578
- this.resolver = resolver;
578
+ this.carrierProvider = carrierProvider;
579
579
  }
580
580
  subscribeOnKey(key, handler) {
581
- const carrier = this.resolver.getOrReserveCarrier(key);
581
+ const carrier = this.carrierProvider.getOrReserveCarrier(key);
582
582
  this.addHandler(carrier, handler);
583
583
  return () => this.removeHandler(carrier, handler);
584
584
  }
585
585
  subscribeOnKeys(keys, handler) {
586
586
  const carriers = [];
587
587
  for (let i = 0; i < keys.length; i++) {
588
- const carrier = this.resolver.getOrReserveCarrier(keys[i]);
588
+ const carrier = this.carrierProvider.getOrReserveCarrier(keys[i]);
589
589
  this.addHandler(carrier, handler);
590
590
  carriers.push(carrier);
591
591
  }
@@ -596,7 +596,7 @@ var OIMCarrierKeyedEmitter = class {
596
596
  };
597
597
  }
598
598
  unsubscribeFromKey(key, handler) {
599
- const carrier = this.resolver.findCarrier(key);
599
+ const carrier = this.carrierProvider.findCarrier(key);
600
600
  if (carrier) this.removeHandler(carrier, handler);
601
601
  }
602
602
  unsubscribeFromKeys(keys, handler) {
@@ -619,7 +619,7 @@ var OIMCarrierKeyedEmitter = class {
619
619
  subscribers.delete(handler);
620
620
  if (subscribers.size === 0) {
621
621
  this.subscribedCarriers.delete(carrier);
622
- this.resolver.onCarrierEmptied?.(carrier);
622
+ this.carrierProvider.onCarrierEmptied?.(carrier);
623
623
  }
624
624
  }
625
625
  /** Fast path: the writer already holds the carrier. */
@@ -637,7 +637,7 @@ var OIMCarrierKeyedEmitter = class {
637
637
  this.assertNotInFlush();
638
638
  return;
639
639
  }
640
- const carrier = this.resolver.findCarrier(key);
640
+ const carrier = this.carrierProvider.findCarrier(key);
641
641
  if (carrier) this.markUpdatedCarrier(carrier);
642
642
  else this.assertNotInFlush();
643
643
  }
@@ -662,7 +662,7 @@ var OIMCarrierKeyedEmitter = class {
662
662
  return this.subscribedCarriers.size > 0;
663
663
  }
664
664
  getHandlerCount(key) {
665
- return this.resolver.findCarrier(key)?.subscribers?.size ?? 0;
665
+ return this.carrierProvider.findCarrier(key)?.subscribers?.size ?? 0;
666
666
  }
667
667
  getMetrics() {
668
668
  let totalHandlers = 0;
@@ -722,8 +722,8 @@ var OIMCarrierKeyedEmitter = class {
722
722
  }
723
723
  };
724
724
 
725
- // src/core/OIMKeyedCarrierResolver.ts
726
- var OIMKeyedCarrierResolver = class {
725
+ // src/core/OIMKeyedCarrierProvider.ts
726
+ var OIMKeyedCarrierProvider = class {
727
727
  constructor() {
728
728
  this.carriers = /* @__PURE__ */ new Map();
729
729
  }
@@ -745,8 +745,8 @@ var OIMKeyedCarrierResolver = class {
745
745
 
746
746
  // src/abstract/OIMReactiveIndex.ts
747
747
  var OIMReactiveIndex = class {
748
- constructor(queue, createIndex, createResolver = () => new OIMKeyedCarrierResolver()) {
749
- this.updateEmitter = new OIMCarrierKeyedEmitter(queue, createResolver());
748
+ constructor(queue, createIndex, createCarrierProvider = () => new OIMKeyedCarrierProvider()) {
749
+ this.updateEmitter = new OIMCarrierKeyedEmitter(queue, createCarrierProvider());
750
750
  this.index = createIndex(this.updateEmitter);
751
751
  }
752
752
  getEntitiesByKey(key) {
@@ -802,8 +802,8 @@ var OIMReactiveIndex = class {
802
802
 
803
803
  // src/abstract/OIMReactiveIndexSetBased.ts
804
804
  var OIMReactiveIndexSetBased = class extends OIMReactiveIndex {
805
- constructor(queue, createIndex, createResolver) {
806
- super(queue, createIndex, createResolver);
805
+ constructor(queue, createIndex, createCarrierProvider) {
806
+ super(queue, createIndex, createCarrierProvider);
807
807
  }
808
808
  getPksByKey(key) {
809
809
  return this.index.getPksByKey(key);
@@ -821,8 +821,8 @@ var OIMReactiveIndexSetBased = class extends OIMReactiveIndex {
821
821
 
822
822
  // src/abstract/OIMReactiveIndexArrayBased.ts
823
823
  var OIMReactiveIndexArrayBased = class extends OIMReactiveIndex {
824
- constructor(queue, createIndex, createResolver) {
825
- super(queue, createIndex, createResolver);
824
+ constructor(queue, createIndex, createCarrierProvider) {
825
+ super(queue, createIndex, createCarrierProvider);
826
826
  }
827
827
  getPksByKey(key) {
828
828
  return this.index.getPksByKey(key);
@@ -1097,24 +1097,10 @@ var OIMPkSelectorFactory = class {
1097
1097
  }
1098
1098
  };
1099
1099
 
1100
- // src/core/OIMKeyDomainNative.ts
1101
- var OIMKeyDomainNative = class {
1102
- createMap() {
1103
- return /* @__PURE__ */ new Map();
1104
- }
1105
- createSet() {
1106
- return /* @__PURE__ */ new Set();
1107
- }
1108
- canonicalize(key) {
1109
- return key;
1110
- }
1111
- };
1112
-
1113
1100
  // src/core/OIMCollectionStoreMapDriven.ts
1114
1101
  var OIMCollectionStoreMapDriven = class extends OIMCollectionStore {
1115
1102
  constructor() {
1116
1103
  super(...arguments);
1117
- this.keyDomain = new OIMKeyDomainNative();
1118
1104
  this.slots = /* @__PURE__ */ new Map();
1119
1105
  // Slots reserved by indexes for PKs whose entity has not arrived yet.
1120
1106
  // They carry `item: undefined` and live apart from `slots` so they do not
@@ -1287,10 +1273,6 @@ var OIMCollection = class {
1287
1273
  this.store = opts?.store ?? new OIMCollectionStoreMapDriven();
1288
1274
  this.updateEntity = opts?.updateEntity ?? new OIMEntityUpdaterFactory().createMergeEntityUpdater();
1289
1275
  }
1290
- /** The collection's PK keying strategy — read by indexes and wrappers. */
1291
- get keyDomain() {
1292
- return this.store.keyDomain;
1293
- }
1294
1276
  getOneByPk(pk) {
1295
1277
  return this.store.getOneByPk(pk);
1296
1278
  }
@@ -1303,6 +1285,14 @@ var OIMCollection = class {
1303
1285
  getOrReserveSlotByPk(pk) {
1304
1286
  return this.store.getOrReserveSlotByPk(pk);
1305
1287
  }
1288
+ /**
1289
+ * The existing slot for `pk` (live or reserved) WITHOUT creating one — used
1290
+ * by indexes to resolve a pk to its canonical slot for removal (delete by
1291
+ * reference), with no side effect for a pk that is not present.
1292
+ */
1293
+ findSlotByPk(pk) {
1294
+ return this.store.findSlotByPk(pk);
1295
+ }
1306
1296
  getSlotsByPks(pks) {
1307
1297
  return this.store.getSlotsByPks(pks);
1308
1298
  }
@@ -1389,7 +1379,9 @@ var OIMReactiveCollection = class extends OIMCollection {
1389
1379
  constructor(queue, opts) {
1390
1380
  super(opts);
1391
1381
  this.anyUpdateHandlers = /* @__PURE__ */ new Set();
1392
- this.pendingAnyUpdatePks = this.store.keyDomain.createSet();
1382
+ // Only ever holds `slot.pk` (one canonical reference per logical key), so a
1383
+ // native `Set` dedups correctly by reference even for composite pks.
1384
+ this.pendingAnyUpdatePks = /* @__PURE__ */ new Set();
1393
1385
  this.isAnyUpdateClearPending = false;
1394
1386
  this.isAnyUpdateScheduled = false;
1395
1387
  this.runAnyUpdate = () => {
@@ -1665,16 +1657,16 @@ var OIMIndexManualOrderedArrayBased = class extends OIMIndexArrayBased {
1665
1657
  var OIMCollectionIndexManualOrderedArrayBased = class extends OIMIndexManualOrderedArrayBased {
1666
1658
  constructor(opts) {
1667
1659
  super();
1668
- this.resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getSlotByPk(pk) : opts.resolveSlot;
1660
+ this.getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getSlotByPk(pk) : opts.getSlot;
1669
1661
  }
1670
1662
  push(key, pk) {
1671
- return this.pushSlot(key, this.resolveRequiredSlot(pk));
1663
+ return this.pushSlot(key, this.getRequiredSlot(pk));
1672
1664
  }
1673
1665
  insertAt(key, index, pk) {
1674
- return this.insertSlotAt(key, index, this.resolveRequiredSlot(pk));
1666
+ return this.insertSlotAt(key, index, this.getRequiredSlot(pk));
1675
1667
  }
1676
1668
  reset(key, pks) {
1677
- this.resetSlots(key, this.resolveSlots(pks));
1669
+ this.resetSlots(key, this.getRequiredSlots(pks));
1678
1670
  }
1679
1671
  getEntitiesByKey(key) {
1680
1672
  return super.getEntitiesByKey(key);
@@ -1682,32 +1674,32 @@ var OIMCollectionIndexManualOrderedArrayBased = class extends OIMIndexManualOrde
1682
1674
  getEntitiesByKeys(keys) {
1683
1675
  return super.getEntitiesByKeys(keys);
1684
1676
  }
1685
- resolvePk(pk) {
1686
- return this.resolveRequiredSlot(pk);
1677
+ // Gets the slot for a pk, throwing if the (custom) getter has none — this
1678
+ // ordered index requires a real slot to place in order.
1679
+ getRequiredSlot(pk) {
1680
+ const slot = this.getSlot(pk);
1681
+ if (!slot) {
1682
+ throw new Error(
1683
+ `[OIMCollectionIndexManualOrderedArrayBased]: no slot for PK "${String(pk)}".`
1684
+ );
1685
+ }
1686
+ return slot;
1687
1687
  }
1688
- resolveSlots(pks) {
1688
+ getRequiredSlots(pks) {
1689
1689
  const slots = [];
1690
1690
  slots.length = pks.length;
1691
1691
  for (let i = 0; i < pks.length; i++) {
1692
- slots[i] = this.resolveRequiredSlot(pks[i]);
1692
+ slots[i] = this.getRequiredSlot(pks[i]);
1693
1693
  }
1694
1694
  return slots;
1695
1695
  }
1696
- resolveRequiredSlot(pk) {
1697
- const slot = this.resolveSlot(pk);
1698
- if (!slot) {
1699
- throw new Error(
1700
- `[OIMCollectionIndexManualOrderedArrayBased]: Unable to resolve slot for PK "${String(pk)}".`
1701
- );
1702
- }
1703
- return slot;
1704
- }
1705
1696
  };
1706
1697
 
1707
1698
  // src/enums/EOIMEventQueueEventType.ts
1708
1699
  var EOIMEventQueueEventType = /* @__PURE__ */ ((EOIMEventQueueEventType2) => {
1709
1700
  EOIMEventQueueEventType2[EOIMEventQueueEventType2["AFTER_FLUSH"] = 0] = "AFTER_FLUSH";
1710
1701
  EOIMEventQueueEventType2[EOIMEventQueueEventType2["BEFORE_FLUSH"] = 1] = "BEFORE_FLUSH";
1702
+ EOIMEventQueueEventType2[EOIMEventQueueEventType2["FLUSH_ERROR"] = 2] = "FLUSH_ERROR";
1711
1703
  return EOIMEventQueueEventType2;
1712
1704
  })(EOIMEventQueueEventType || {});
1713
1705
 
@@ -2120,18 +2112,18 @@ var OIMOrderedListCommandStream = class extends OIMOrderedListCommandBuffer {
2120
2112
  var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandStream {
2121
2113
  constructor(queue, opts) {
2122
2114
  const index = opts.index ?? new OIMCollectionIndexManualOrderedArrayBased(
2123
- opts.collection !== void 0 ? { collection: opts.collection } : { resolveSlot: opts.resolveSlot }
2115
+ opts.collection !== void 0 ? { collection: opts.collection } : { getSlot: opts.getSlot }
2124
2116
  );
2125
2117
  super(queue, index);
2126
2118
  this.index = index;
2127
2119
  }
2128
2120
  push(key, pk) {
2129
- const slot = this.resolvePk(pk);
2121
+ const slot = this.getRequiredSlot(pk);
2130
2122
  const index = this.index.pushSlot(key, slot);
2131
2123
  this.appendCommand(key, { type: "insert", index, item: slot });
2132
2124
  }
2133
2125
  insertAt(key, index, pk) {
2134
- const slot = this.resolvePk(pk);
2126
+ const slot = this.getRequiredSlot(pk);
2135
2127
  const safeIndex = this.index.insertSlotAt(key, index, slot);
2136
2128
  this.appendCommand(key, {
2137
2129
  type: "insert",
@@ -2141,7 +2133,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
2141
2133
  }
2142
2134
  /** Replace the element at `index` with the slot for `pk`, in place. */
2143
2135
  setAt(key, index, pk) {
2144
- const slot = this.resolvePk(pk);
2136
+ const slot = this.getRequiredSlot(pk);
2145
2137
  const safeIndex = this.index.setSlotAt(key, index, slot);
2146
2138
  if (safeIndex < 0) return;
2147
2139
  this.appendCommand(key, {
@@ -2151,7 +2143,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
2151
2143
  });
2152
2144
  }
2153
2145
  set(key, pks) {
2154
- const slots = pks.map((pk) => this.resolvePk(pk));
2146
+ const slots = pks.map((pk) => this.getRequiredSlot(pk));
2155
2147
  this.index.resetSlots(key, slots);
2156
2148
  this.appendResetCommand(key, slots);
2157
2149
  }
@@ -2163,8 +2155,8 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
2163
2155
  getEntitiesByKey(key) {
2164
2156
  return this.index.getEntitiesByKey(key);
2165
2157
  }
2166
- resolvePk(pk) {
2167
- return this.index.resolvePk(
2158
+ getRequiredSlot(pk) {
2159
+ return this.index.getRequiredSlot(
2168
2160
  pk
2169
2161
  );
2170
2162
  }
@@ -2224,8 +2216,8 @@ var OIMIndexManualArrayBased = class extends OIMIndexArrayBased {
2224
2216
  }
2225
2217
  };
2226
2218
 
2227
- // src/core/OIMBucketCarrierResolver.ts
2228
- var OIMBucketCarrierResolver = class {
2219
+ // src/core/OIMBucketCarrierProvider.ts
2220
+ var OIMBucketCarrierProvider = class {
2229
2221
  constructor(store) {
2230
2222
  this.store = store;
2231
2223
  }
@@ -2266,7 +2258,7 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
2266
2258
  comparePks: opts?.indexOptions?.comparePks,
2267
2259
  store
2268
2260
  }),
2269
- () => new OIMBucketCarrierResolver(store)
2261
+ () => new OIMBucketCarrierProvider(store)
2270
2262
  );
2271
2263
  }
2272
2264
  setSlots(key, slots) {
@@ -2283,52 +2275,61 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
2283
2275
  // src/core/OIMReactiveCollectionIndexManualArrayBased.ts
2284
2276
  var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexManualArrayBased {
2285
2277
  constructor(queue, opts) {
2286
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
2287
- const pkDomain = opts.collection?.keyDomain ?? new OIMKeyDomainNative();
2278
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
2288
2279
  super(queue, {
2289
2280
  indexOptions: opts.indexOptions
2290
2281
  });
2291
- // Persistent per-key pk membership for O(1) `addPks` dedup (avoids rebuilding
2292
- // a Set from the whole bucket on every call). Kept in sync by setSlots/clear.
2293
- this.pksByKey = /* @__PURE__ */ new Map();
2294
- this.resolveSlot = resolveSlot;
2295
- this.pkDomain = pkDomain;
2282
+ // Persistent per-key membership for O(1) `addPks` dedup, keyed by the
2283
+ // canonical slot reference (correct for composite pks with a native Set — no
2284
+ // content-addressing needed, since slots are one reference per logical key).
2285
+ this.slotsByKey = /* @__PURE__ */ new Map();
2286
+ this.getSlot = getSlot;
2287
+ this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
2296
2288
  }
2297
2289
  setPks(key, pks) {
2298
- const pkSet = this.pkDomain.createSet();
2299
- for (let i = 0; i < pks.length; i++) pkSet.add(pks[i]);
2300
- this.pksByKey.set(key, pkSet);
2301
- super.setSlots(key, this.resolveSlots(pks));
2290
+ const slots = this.getSlotsOrTransient(pks);
2291
+ this.slotsByKey.set(key, new Set(slots));
2292
+ super.setSlots(key, slots);
2302
2293
  }
2303
2294
  addPks(key, pks) {
2304
2295
  if (pks.length === 0) return;
2305
- const pkSet = this.membershipOf(key);
2296
+ const slotSet = this.membershipOf(key);
2306
2297
  const newSlots = [];
2307
2298
  for (const pk of pks) {
2308
- if (pkSet.has(pk)) continue;
2309
- pkSet.add(pk);
2310
- newSlots.push(this.resolveRequiredSlot(pk));
2299
+ const slot = this.getSlotOrTransient(pk);
2300
+ if (slotSet.has(slot)) continue;
2301
+ slotSet.add(slot);
2302
+ newSlots.push(slot);
2311
2303
  }
2312
2304
  if (newSlots.length > 0) this.appendSlots(key, newSlots);
2313
2305
  }
2314
2306
  removePks(key, pks) {
2315
2307
  if (pks.length === 0) return;
2316
- const pksToRemove = new Set(pks);
2308
+ const slotsToRemove = /* @__PURE__ */ new Set();
2309
+ const pksToRemove = /* @__PURE__ */ new Set();
2310
+ for (let i = 0; i < pks.length; i++) {
2311
+ const slot = this.findSlotForRemoval(pks[i]);
2312
+ if (slot) slotsToRemove.add(slot);
2313
+ else pksToRemove.add(pks[i]);
2314
+ }
2317
2315
  const existingSlots = this.index.getSlotsByKey(key);
2318
- const nextSlots = existingSlots.filter(
2319
- (slot) => !pksToRemove.has(slot.pk)
2320
- );
2321
- if (nextSlots.length === existingSlots.length) return;
2322
- const pkSet = this.pksByKey.get(key);
2323
- if (pkSet) {
2324
- for (let i = 0; i < pks.length; i++) pkSet.delete(pks[i]);
2316
+ const slotSet = this.slotsByKey.get(key);
2317
+ const nextSlots = [];
2318
+ for (let i = 0; i < existingSlots.length; i++) {
2319
+ const slot = existingSlots[i];
2320
+ if (slotsToRemove.has(slot) || pksToRemove.has(slot.pk)) {
2321
+ slotSet?.delete(slot);
2322
+ } else {
2323
+ nextSlots.push(slot);
2324
+ }
2325
2325
  }
2326
+ if (nextSlots.length === existingSlots.length) return;
2326
2327
  if (nextSlots.length === 0) this.clear(key);
2327
2328
  else super.setSlots(key, nextSlots);
2328
2329
  }
2329
2330
  clear(key) {
2330
- if (key === void 0) this.pksByKey.clear();
2331
- else this.pksByKey.delete(key);
2331
+ if (key === void 0) this.slotsByKey.clear();
2332
+ else this.slotsByKey.delete(key);
2332
2333
  super.clear(key);
2333
2334
  }
2334
2335
  /**
@@ -2336,16 +2337,12 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
2336
2337
  * stays correct even if slots were set through a lower-level path.
2337
2338
  */
2338
2339
  membershipOf(key) {
2339
- let pkSet = this.pksByKey.get(key);
2340
- if (!pkSet) {
2341
- pkSet = this.pkDomain.createSet();
2342
- const existing = this.index.getSlotsByKey(key);
2343
- for (let i = 0; i < existing.length; i++) {
2344
- pkSet.add(existing[i].pk);
2345
- }
2346
- this.pksByKey.set(key, pkSet);
2340
+ let slotSet = this.slotsByKey.get(key);
2341
+ if (!slotSet) {
2342
+ slotSet = new Set(this.index.getSlotsByKey(key));
2343
+ this.slotsByKey.set(key, slotSet);
2347
2344
  }
2348
- return pkSet;
2345
+ return slotSet;
2349
2346
  }
2350
2347
  getEntitiesByKey(key) {
2351
2348
  return super.getEntitiesByKey(key);
@@ -2353,16 +2350,16 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
2353
2350
  getEntitiesByKeys(keys) {
2354
2351
  return super.getEntitiesByKeys(keys);
2355
2352
  }
2356
- resolveSlots(pks) {
2353
+ getSlotsOrTransient(pks) {
2357
2354
  const slots = [];
2358
2355
  slots.length = pks.length;
2359
2356
  for (let i = 0; i < pks.length; i++) {
2360
- slots[i] = this.resolveRequiredSlot(pks[i]);
2357
+ slots[i] = this.getSlotOrTransient(pks[i]);
2361
2358
  }
2362
2359
  return slots;
2363
2360
  }
2364
- resolveRequiredSlot(pk) {
2365
- const slot = this.resolveSlot(pk);
2361
+ getSlotOrTransient(pk) {
2362
+ const slot = this.getSlot(pk);
2366
2363
  if (!slot) return { pk, item: void 0 };
2367
2364
  return slot;
2368
2365
  }
@@ -2372,7 +2369,6 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
2372
2369
  var OIMIndexManualSetBased = class extends OIMIndexSetBased {
2373
2370
  constructor(options = {}) {
2374
2371
  super(options);
2375
- this.pkDomain = options.pkDomain ?? new OIMKeyDomainNative();
2376
2372
  }
2377
2373
  setSlots(key, slots) {
2378
2374
  const bucket = this.setStore.getOrReserveBucket(key);
@@ -2381,27 +2377,28 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
2381
2377
  // --- pk-oriented writes: resolve the bucket ONCE and use its own membership
2382
2378
  // (pk → slot) for dedup/removal, so a composite (trie) key is walked a single
2383
2379
  // time instead of once for the bucket and once for a separate membership map.
2384
- setPks(key, pks, resolveSlot) {
2380
+ setPks(key, pks, getSlot) {
2385
2381
  const bucket = this.setStore.getOrReserveBucket(key);
2386
2382
  const slots = [];
2387
- for (let i = 0; i < pks.length; i++) slots.push(resolveSlot(pks[i]));
2383
+ for (let i = 0; i < pks.length; i++) slots.push(getSlot(pks[i]));
2388
2384
  this.replaceBucketContents(bucket, slots);
2389
- const membership = bucket.membership ?? (bucket.membership = this.pkDomain.createMap());
2385
+ const membership = bucket.membership ?? (bucket.membership = /* @__PURE__ */ new Map());
2390
2386
  membership.clear();
2391
- for (let i = 0; i < pks.length; i++) {
2392
- if (!membership.has(pks[i])) membership.set(pks[i], slots[i]);
2387
+ for (let i = 0; i < slots.length; i++) {
2388
+ if (!membership.has(slots[i].pk)) {
2389
+ membership.set(slots[i].pk, slots[i]);
2390
+ }
2393
2391
  }
2394
2392
  }
2395
- addPks(key, pks, resolveSlot) {
2393
+ addPks(key, pks, getSlot) {
2396
2394
  if (pks.length === 0) return;
2397
2395
  const bucket = this.setStore.getOrReserveBucket(key);
2398
2396
  const membership = this.membershipOf(bucket);
2399
2397
  let changed = false;
2400
2398
  for (let i = 0; i < pks.length; i++) {
2401
- const pk = pks[i];
2402
- if (membership.has(pk)) continue;
2403
- const slot = resolveSlot(pk);
2404
- membership.set(pk, slot);
2399
+ const slot = getSlot(pks[i]);
2400
+ if (membership.has(slot.pk)) continue;
2401
+ membership.set(slot.pk, slot);
2405
2402
  if (!bucket.has(slot)) {
2406
2403
  bucket.add(slot);
2407
2404
  changed = true;
@@ -2411,6 +2408,11 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
2411
2408
  this.setStore.retainBucket(bucket);
2412
2409
  this.emitBucketChanged(bucket);
2413
2410
  }
2411
+ /**
2412
+ * Removes by pk. `pks` must be canonical `slot.pk` references (membership is
2413
+ * keyed by them): for primitive pks that is just the pk; a collection-bound
2414
+ * composite index canonicalizes raw pks to `slot.pk` before calling this.
2415
+ */
2414
2416
  removePks(key, pks) {
2415
2417
  if (pks.length === 0) return;
2416
2418
  const bucket = this.setStore.findBucket(key);
@@ -2436,7 +2438,7 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
2436
2438
  membershipOf(bucket) {
2437
2439
  let membership = bucket.membership;
2438
2440
  if (!membership) {
2439
- membership = this.pkDomain.createMap();
2441
+ membership = /* @__PURE__ */ new Map();
2440
2442
  bucket.membership = membership;
2441
2443
  }
2442
2444
  if (membership.size === 0 && bucket.size > 0) {
@@ -2545,10 +2547,9 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
2545
2547
  queue,
2546
2548
  (updateEmitter) => new OIMIndexManualSetBasedReactive(updateEmitter, {
2547
2549
  comparePks: opts?.indexOptions?.comparePks,
2548
- store,
2549
- pkDomain: opts?.pkDomain
2550
+ store
2550
2551
  }),
2551
- () => new OIMBucketCarrierResolver(store)
2552
+ () => new OIMBucketCarrierProvider(store)
2552
2553
  );
2553
2554
  }
2554
2555
  setSlots(key, slots) {
@@ -2568,28 +2569,33 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
2568
2569
  // src/core/OIMReactiveCollectionIndexManualSetBased.ts
2569
2570
  var OIMReactiveCollectionIndexManualSetBased = class extends OIMReactiveIndexManualSetBased {
2570
2571
  constructor(queue, opts) {
2571
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
2572
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
2572
2573
  super(queue, {
2573
- indexOptions: opts.indexOptions,
2574
- pkDomain: opts.collection?.keyDomain
2574
+ indexOptions: opts.indexOptions
2575
2575
  });
2576
2576
  // Bound once so the hot pk-write path passes a stable function (no per-call
2577
2577
  // closure allocation).
2578
- this.resolveRequiredSlot = (pk) => {
2579
- const slot = this.resolveSlot(pk);
2578
+ this.getSlotOrTransient = (pk) => {
2579
+ const slot = this.getSlot(pk);
2580
2580
  if (!slot) return { pk, item: void 0 };
2581
2581
  return slot;
2582
2582
  };
2583
- this.resolveSlot = resolveSlot;
2583
+ this.getSlot = getSlot;
2584
+ this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
2584
2585
  }
2585
2586
  setPks(key, pks) {
2586
- this.index.setPks(key, pks, this.resolveRequiredSlot);
2587
+ this.index.setPks(key, pks, this.getSlotOrTransient);
2587
2588
  }
2588
2589
  addPks(key, pks) {
2589
- this.index.addPks(key, pks, this.resolveRequiredSlot);
2590
+ this.index.addPks(key, pks, this.getSlotOrTransient);
2590
2591
  }
2591
2592
  removePks(key, pks) {
2592
- this.index.removePks(key, pks);
2593
+ const canonical = [];
2594
+ for (let i = 0; i < pks.length; i++) {
2595
+ const slot = this.findSlotForRemoval(pks[i]);
2596
+ canonical.push(slot ? slot.pk : pks[i]);
2597
+ }
2598
+ this.index.removePks(key, canonical);
2593
2599
  }
2594
2600
  getEntitiesByKey(key) {
2595
2601
  return super.getEntitiesByKey(key);
@@ -2798,29 +2804,34 @@ var OIMIndexStoreTrieDrivenSetBased = class extends OIMIndexStoreSetBased {
2798
2804
  // src/core/OIMReactiveCollectionIndexCompositeTrieSetBased.ts
2799
2805
  var OIMReactiveCollectionIndexCompositeTrieSetBased = class extends OIMReactiveIndexManualSetBased {
2800
2806
  constructor(queue, opts) {
2801
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
2807
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
2802
2808
  super(queue, {
2803
2809
  indexOptions: {
2804
2810
  comparePks: opts.indexOptions?.comparePks,
2805
2811
  store: opts.indexOptions?.store ?? new OIMIndexStoreTrieDrivenSetBased()
2806
- },
2807
- pkDomain: opts.collection?.keyDomain
2812
+ }
2808
2813
  });
2809
- this.resolveRequiredSlot = (pk) => {
2810
- const slot = this.resolveSlot(pk);
2814
+ this.getSlotOrTransient = (pk) => {
2815
+ const slot = this.getSlot(pk);
2811
2816
  if (!slot) return { pk, item: void 0 };
2812
2817
  return slot;
2813
2818
  };
2814
- this.resolveSlot = resolveSlot;
2819
+ this.getSlot = getSlot;
2820
+ this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
2815
2821
  }
2816
2822
  setPks(key, pks) {
2817
- this.index.setPks(key, pks, this.resolveRequiredSlot);
2823
+ this.index.setPks(key, pks, this.getSlotOrTransient);
2818
2824
  }
2819
2825
  addPks(key, pks) {
2820
- this.index.addPks(key, pks, this.resolveRequiredSlot);
2826
+ this.index.addPks(key, pks, this.getSlotOrTransient);
2821
2827
  }
2822
2828
  removePks(key, pks) {
2823
- this.index.removePks(key, pks);
2829
+ const canonical = [];
2830
+ for (let i = 0; i < pks.length; i++) {
2831
+ const slot = this.findSlotForRemoval(pks[i]);
2832
+ canonical.push(slot ? slot.pk : pks[i]);
2833
+ }
2834
+ this.index.removePks(key, canonical);
2824
2835
  }
2825
2836
  getEntitiesByKey(key) {
2826
2837
  return super.getEntitiesByKey(key);
@@ -2927,7 +2938,7 @@ var OIMIndexStoreTrieDrivenArrayBased = class extends OIMIndexStoreArrayBased {
2927
2938
  // src/core/OIMReactiveCollectionIndexCompositeTrieArrayBased.ts
2928
2939
  var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiveIndexManualArrayBased {
2929
2940
  constructor(queue, opts) {
2930
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
2941
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
2931
2942
  super(queue, {
2932
2943
  indexOptions: {
2933
2944
  comparePks: opts.indexOptions?.comparePks,
@@ -2937,13 +2948,13 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
2937
2948
  // Persistent per-key-path pk membership for O(1) `addPks` dedup. Trie-keyed
2938
2949
  // so a rebuilt key path matches by content.
2939
2950
  this.pksByKey = new OIMTrieMap();
2940
- this.resolveSlot = resolveSlot;
2951
+ this.getSlot = getSlot;
2941
2952
  }
2942
2953
  setPks(key, pks) {
2943
2954
  const pkSet = /* @__PURE__ */ new Set();
2944
2955
  for (let i = 0; i < pks.length; i++) pkSet.add(pks[i]);
2945
2956
  this.pksByKey.set(key, pkSet);
2946
- super.setSlots(key, this.resolveSlots(pks));
2957
+ super.setSlots(key, this.getSlotsOrTransient(pks));
2947
2958
  }
2948
2959
  addPks(key, pks) {
2949
2960
  if (pks.length === 0) return;
@@ -2952,7 +2963,7 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
2952
2963
  for (const pk of pks) {
2953
2964
  if (pkSet.has(pk)) continue;
2954
2965
  pkSet.add(pk);
2955
- newSlots.push(this.resolveRequiredSlot(pk));
2966
+ newSlots.push(this.getSlotOrTransient(pk));
2956
2967
  }
2957
2968
  if (newSlots.length > 0) this.appendSlots(key, newSlots);
2958
2969
  }
@@ -2998,16 +3009,16 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
2998
3009
  getEntitiesByKeys(keys) {
2999
3010
  return super.getEntitiesByKeys(keys);
3000
3011
  }
3001
- resolveSlots(pks) {
3012
+ getSlotsOrTransient(pks) {
3002
3013
  const slots = [];
3003
3014
  slots.length = pks.length;
3004
3015
  for (let i = 0; i < pks.length; i++) {
3005
- slots[i] = this.resolveRequiredSlot(pks[i]);
3016
+ slots[i] = this.getSlotOrTransient(pks[i]);
3006
3017
  }
3007
3018
  return slots;
3008
3019
  }
3009
- resolveRequiredSlot(pk) {
3010
- const slot = this.resolveSlot(pk);
3020
+ getSlotOrTransient(pk) {
3021
+ const slot = this.getSlot(pk);
3011
3022
  if (!slot) return { pk, item: void 0 };
3012
3023
  return slot;
3013
3024
  }
@@ -3320,20 +3331,20 @@ var OIMReactiveGlobalIndexManualArrayBased = class extends OIMReactiveGlobalInde
3320
3331
  // src/core/OIMReactiveCollectionGlobalIndexManualArrayBased.ts
3321
3332
  var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactiveGlobalIndexManualArrayBased {
3322
3333
  constructor(queue, opts) {
3323
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
3334
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
3324
3335
  super(queue, { indexOptions: opts.indexOptions });
3325
3336
  // Single pk membership set for O(1) `addPks` dedup. Lazily seeded from the
3326
3337
  // bucket so it stays correct even after a raw `setSlots` (e.g. derived
3327
3338
  // rebuild), matching the keyed index's `membershipOf`.
3328
3339
  this.membership = /* @__PURE__ */ new Set();
3329
3340
  this.membershipSeeded = false;
3330
- this.resolveSlot = resolveSlot;
3341
+ this.getSlot = getSlot;
3331
3342
  }
3332
3343
  setPks(pks) {
3333
3344
  this.membership.clear();
3334
3345
  for (let i = 0; i < pks.length; i++) this.membership.add(pks[i]);
3335
3346
  this.membershipSeeded = true;
3336
- super.setSlots(this.resolveSlots(pks));
3347
+ super.setSlots(this.getSlotsOrTransient(pks));
3337
3348
  }
3338
3349
  addPks(pks) {
3339
3350
  if (pks.length === 0) return;
@@ -3342,7 +3353,7 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
3342
3353
  for (const pk of pks) {
3343
3354
  if (membership.has(pk)) continue;
3344
3355
  membership.add(pk);
3345
- newSlots.push(this.resolveRequiredSlot(pk));
3356
+ newSlots.push(this.getSlotOrTransient(pk));
3346
3357
  }
3347
3358
  if (newSlots.length > 0) super.appendSlots(newSlots);
3348
3359
  }
@@ -3379,16 +3390,16 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
3379
3390
  getEntities() {
3380
3391
  return super.getEntities();
3381
3392
  }
3382
- resolveSlots(pks) {
3393
+ getSlotsOrTransient(pks) {
3383
3394
  const slots = [];
3384
3395
  slots.length = pks.length;
3385
3396
  for (let i = 0; i < pks.length; i++) {
3386
- slots[i] = this.resolveRequiredSlot(pks[i]);
3397
+ slots[i] = this.getSlotOrTransient(pks[i]);
3387
3398
  }
3388
3399
  return slots;
3389
3400
  }
3390
- resolveRequiredSlot(pk) {
3391
- const slot = this.resolveSlot(pk);
3401
+ getSlotOrTransient(pk) {
3402
+ const slot = this.getSlot(pk);
3392
3403
  if (!slot) return { pk, item: void 0 };
3393
3404
  return slot;
3394
3405
  }
@@ -3468,18 +3479,18 @@ var OIMReactiveGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexS
3468
3479
  // src/core/OIMReactiveCollectionGlobalIndexManualSetBased.ts
3469
3480
  var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexManualSetBased {
3470
3481
  constructor(queue, opts) {
3471
- const resolveSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.resolveSlot;
3482
+ const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
3472
3483
  super(queue, { indexOptions: opts.indexOptions });
3473
3484
  this.membership = /* @__PURE__ */ new Map();
3474
3485
  this.membershipSeeded = false;
3475
- this.resolveSlot = resolveSlot;
3486
+ this.getSlot = getSlot;
3476
3487
  }
3477
3488
  setPks(pks) {
3478
3489
  this.membership.clear();
3479
3490
  const slots = [];
3480
3491
  for (let i = 0; i < pks.length; i++) {
3481
3492
  const pk = pks[i];
3482
- const slot = this.resolveRequiredSlot(pk);
3493
+ const slot = this.getSlotOrTransient(pk);
3483
3494
  if (!this.membership.has(pk)) this.membership.set(pk, slot);
3484
3495
  slots.push(slot);
3485
3496
  }
@@ -3492,7 +3503,7 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
3492
3503
  const newSlots = [];
3493
3504
  for (const pk of pks) {
3494
3505
  if (membership.has(pk)) continue;
3495
- const slot = this.resolveRequiredSlot(pk);
3506
+ const slot = this.getSlotOrTransient(pk);
3496
3507
  membership.set(pk, slot);
3497
3508
  newSlots.push(slot);
3498
3509
  }
@@ -3531,8 +3542,8 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
3531
3542
  getEntities() {
3532
3543
  return super.getEntities();
3533
3544
  }
3534
- resolveRequiredSlot(pk) {
3535
- const slot = this.resolveSlot(pk);
3545
+ getSlotOrTransient(pk) {
3546
+ const slot = this.getSlot(pk);
3536
3547
  if (!slot) return { pk, item: void 0 };
3537
3548
  return slot;
3538
3549
  }
@@ -3941,7 +3952,7 @@ var OIMObject = class {
3941
3952
  var OIMReactiveObject = class extends OIMObject {
3942
3953
  constructor(queue, opts) {
3943
3954
  super(opts);
3944
- this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new OIMKeyedCarrierResolver());
3955
+ this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new OIMKeyedCarrierProvider());
3945
3956
  }
3946
3957
  /**
3947
3958
  * Mark the written key(s) on the keyed emitter directly — no general-event
@@ -3983,57 +3994,10 @@ var OIMReactiveObject = class extends OIMObject {
3983
3994
  }
3984
3995
  };
3985
3996
 
3986
- // src/core/OIMTrieSet.ts
3987
- var OIMTrieSet = class {
3988
- constructor() {
3989
- this.map = new OIMTrieMap();
3990
- }
3991
- get size() {
3992
- return this.map.size;
3993
- }
3994
- add(key) {
3995
- this.map.set(key, true);
3996
- }
3997
- has(key) {
3998
- return this.map.has(key);
3999
- }
4000
- delete(key) {
4001
- return this.map.delete(key);
4002
- }
4003
- *values() {
4004
- yield* this.map.keys();
4005
- }
4006
- clear() {
4007
- this.map.clear();
4008
- }
4009
- };
4010
-
4011
- // src/core/OIMKeyDomainTrie.ts
4012
- var OIMKeyDomainTrie = class {
4013
- constructor() {
4014
- // Interning pool: logical key (by content) → the one canonical reference.
4015
- this.pool = new OIMTrieMap();
4016
- }
4017
- createMap() {
4018
- return new OIMTrieMap();
4019
- }
4020
- createSet() {
4021
- return new OIMTrieSet();
4022
- }
4023
- canonicalize(key) {
4024
- const existing = this.pool.get(key);
4025
- if (existing !== void 0) return existing;
4026
- const canonical = Object.freeze(key.slice());
4027
- this.pool.set(canonical, canonical);
4028
- return canonical;
4029
- }
4030
- };
4031
-
4032
3997
  // src/core/OIMCollectionStoreTrieDriven.ts
4033
3998
  var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
4034
- constructor(keyDomain = new OIMKeyDomainTrie()) {
4035
- super();
4036
- this.keyDomain = keyDomain;
3999
+ constructor() {
4000
+ super(...arguments);
4037
4001
  this.slots = new OIMTrieMap();
4038
4002
  this.reservedSlots = new OIMTrieMap();
4039
4003
  }
@@ -4051,7 +4015,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
4051
4015
  return reserved;
4052
4016
  }
4053
4017
  const nextSlot = {
4054
- pk: this.keyDomain.canonicalize(pk),
4018
+ pk,
4055
4019
  item: entity
4056
4020
  };
4057
4021
  this.slots.set(pk, nextSlot);
@@ -4062,7 +4026,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
4062
4026
  if (slot) return slot;
4063
4027
  let reserved = this.reservedSlots.get(pk);
4064
4028
  if (!reserved) {
4065
- reserved = { pk: this.keyDomain.canonicalize(pk), item: void 0 };
4029
+ reserved = { pk, item: void 0 };
4066
4030
  this.reservedSlots.set(pk, reserved);
4067
4031
  }
4068
4032
  return reserved;
@@ -4219,8 +4183,8 @@ var OIMObjectStoreMapDriven = class extends OIMObjectStore {
4219
4183
  }
4220
4184
  };
4221
4185
 
4222
- // src/core/OIMKeyPathCarrierResolver.ts
4223
- var OIMKeyPathCarrierResolver = class {
4186
+ // src/core/OIMKeyPathCarrierProvider.ts
4187
+ var OIMKeyPathCarrierProvider = class {
4224
4188
  constructor() {
4225
4189
  this.carriers = new OIMTrieMap();
4226
4190
  }
@@ -4273,6 +4237,7 @@ var OIMEventQueue = class {
4273
4237
  this.tasksSpare = /* @__PURE__ */ new Set();
4274
4238
  this.isFlushing = false;
4275
4239
  this.scheduler = options.scheduler;
4240
+ this.onError = options.onError;
4276
4241
  if (this.scheduler) {
4277
4242
  this.flushBound = () => this.flush();
4278
4243
  this.scheduler.on(
@@ -4312,12 +4277,34 @@ var OIMEventQueue = class {
4312
4277
  const flushing = this.tasks;
4313
4278
  this.tasks = this.tasksSpare;
4314
4279
  this.flushing = flushing;
4315
- for (const task of flushing) task();
4316
- flushing.clear();
4317
- this.tasksSpare = flushing;
4318
- this.flushing = void 0;
4319
- this.isFlushing = false;
4280
+ let errors;
4281
+ try {
4282
+ for (const task of flushing) {
4283
+ try {
4284
+ task();
4285
+ } catch (error) {
4286
+ (errors ?? (errors = [])).push(error);
4287
+ this.emitter.emit(2 /* FLUSH_ERROR */, {
4288
+ error
4289
+ });
4290
+ this.onError?.(error);
4291
+ }
4292
+ }
4293
+ } finally {
4294
+ flushing.clear();
4295
+ this.tasksSpare = flushing;
4296
+ this.flushing = void 0;
4297
+ this.isFlushing = false;
4298
+ }
4320
4299
  this.emitter.emit(0 /* AFTER_FLUSH */, void 0);
4300
+ if (errors && this.onError === void 0) {
4301
+ if (errors.length === 1) throw errors[0];
4302
+ const AggregateErrorCtor = globalThis.AggregateError;
4303
+ throw AggregateErrorCtor ? new AggregateErrorCtor(
4304
+ errors,
4305
+ "Errors thrown during queue flush"
4306
+ ) : errors[0];
4307
+ }
4321
4308
  }
4322
4309
  /**
4323
4310
  * Get the current number of queued functions.
@@ -4520,6 +4507,31 @@ function createOIMDisposeScope() {
4520
4507
  return new OIMDisposeScope();
4521
4508
  }
4522
4509
 
4510
+ // src/core/OIMTrieSet.ts
4511
+ var OIMTrieSet = class {
4512
+ constructor() {
4513
+ this.map = new OIMTrieMap();
4514
+ }
4515
+ get size() {
4516
+ return this.map.size;
4517
+ }
4518
+ add(key) {
4519
+ this.map.set(key, true);
4520
+ }
4521
+ has(key) {
4522
+ return this.map.has(key);
4523
+ }
4524
+ delete(key) {
4525
+ return this.map.delete(key);
4526
+ }
4527
+ *values() {
4528
+ yield* this.map.keys();
4529
+ }
4530
+ clear() {
4531
+ this.map.clear();
4532
+ }
4533
+ };
4534
+
4523
4535
  // src/core/OIMPkCodecKeyPath.ts
4524
4536
  var OIMPkCodecKeyPath = class {
4525
4537
  encode(pk) {
@@ -6167,35 +6179,20 @@ var OIMComputed = class {
6167
6179
  };
6168
6180
 
6169
6181
  // src/modules/effect/core/OIMEffectDependencyKeyed.ts
6170
- function isReadonlyArray(value) {
6171
- return Array.isArray(value);
6172
- }
6173
6182
  var OIMEffectDependencyKeyed = class {
6174
- constructor(source, keyOrKeys) {
6183
+ constructor(source, key) {
6175
6184
  this.source = source;
6176
- if (isReadonlyArray(keyOrKeys)) {
6177
- this.keys = keyOrKeys;
6178
- } else {
6179
- this.key = keyOrKeys;
6180
- }
6185
+ this.key = key;
6181
6186
  }
6182
6187
  subscribe(onUpdate) {
6183
- if (this.keys !== void 0) {
6184
- return this.source.subscribeOnKeys(this.keys, onUpdate);
6185
- }
6186
- if (this.key === void 0) return () => {
6187
- };
6188
6188
  return this.source.subscribeOnKey(this.key, onUpdate);
6189
6189
  }
6190
6190
  };
6191
6191
 
6192
6192
  // src/modules/effect/core/OIMEffectDependencyKeyedObject.ts
6193
6193
  var OIMEffectDependencyKeyedObject = class {
6194
- constructor(object, keyOrKeys) {
6195
- this.dep = new OIMEffectDependencyKeyed(
6196
- object,
6197
- keyOrKeys
6198
- );
6194
+ constructor(object, key) {
6195
+ this.dep = new OIMEffectDependencyKeyed(object, key);
6199
6196
  }
6200
6197
  get source() {
6201
6198
  return this.dep.source;
@@ -6207,11 +6204,8 @@ var OIMEffectDependencyKeyedObject = class {
6207
6204
 
6208
6205
  // src/modules/effect/core/OIMEffectDependencyKeyedCollection.ts
6209
6206
  var OIMEffectDependencyKeyedCollection = class {
6210
- constructor(collection, pkOrPks) {
6211
- this.dep = new OIMEffectDependencyKeyed(
6212
- collection,
6213
- pkOrPks
6214
- );
6207
+ constructor(collection, pk) {
6208
+ this.dep = new OIMEffectDependencyKeyed(collection, pk);
6215
6209
  }
6216
6210
  get source() {
6217
6211
  return this.dep.source;
@@ -6223,11 +6217,8 @@ var OIMEffectDependencyKeyedCollection = class {
6223
6217
 
6224
6218
  // src/modules/effect/core/OIMEffectDependencyKeyedIndex.ts
6225
6219
  var OIMEffectDependencyKeyedIndex = class {
6226
- constructor(index, keyOrKeys) {
6227
- this.dep = new OIMEffectDependencyKeyed(
6228
- index,
6229
- keyOrKeys
6230
- );
6220
+ constructor(index, key) {
6221
+ this.dep = new OIMEffectDependencyKeyed(index, key);
6231
6222
  }
6232
6223
  get source() {
6233
6224
  return this.dep.source;
@@ -6374,7 +6365,7 @@ export {
6374
6365
  EOIMEventQueueSchedulerEventType,
6375
6366
  EOIMIndexEventType,
6376
6367
  EOIMObjectEventType,
6377
- OIMBucketCarrierResolver,
6368
+ OIMBucketCarrierProvider,
6378
6369
  OIMCarrierKeyedEmitter,
6379
6370
  OIMCarrierSingleEmitter,
6380
6371
  OIMCollection,
@@ -6441,9 +6432,7 @@ export {
6441
6432
  OIMIndexStoreSetBased,
6442
6433
  OIMIndexStoreTrieDrivenArrayBased,
6443
6434
  OIMIndexStoreTrieDrivenSetBased,
6444
- OIMKeyDomainNative,
6445
- OIMKeyDomainTrie,
6446
- OIMKeyPathCarrierResolver,
6435
+ OIMKeyPathCarrierProvider,
6447
6436
  OIMKeyedBucketArrayBased,
6448
6437
  OIMKeyedBucketSetBased,
6449
6438
  OIMMap2Keys,