@oimdb/core 3.8.0 → 3.9.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 +23 -4
- package/dist/index.cjs +209 -246
- package/dist/index.d.cts +120 -178
- package/dist/index.d.ts +120 -178
- package/dist/index.js +207 -242
- package/llms.txt +40 -1
- package/package.json +2 -1
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,
|
|
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.
|
|
578
|
+
this.carrierProvider = carrierProvider;
|
|
579
579
|
}
|
|
580
580
|
subscribeOnKey(key, handler) {
|
|
581
|
-
const carrier = this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
726
|
-
var
|
|
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,
|
|
749
|
-
this.updateEmitter = new OIMCarrierKeyedEmitter(queue,
|
|
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,
|
|
806
|
-
super(queue, createIndex,
|
|
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,
|
|
825
|
-
super(queue, createIndex,
|
|
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
|
-
|
|
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.
|
|
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.
|
|
1663
|
+
return this.pushSlot(key, this.getRequiredSlot(pk));
|
|
1672
1664
|
}
|
|
1673
1665
|
insertAt(key, index, pk) {
|
|
1674
|
-
return this.insertSlotAt(key, index, this.
|
|
1666
|
+
return this.insertSlotAt(key, index, this.getRequiredSlot(pk));
|
|
1675
1667
|
}
|
|
1676
1668
|
reset(key, pks) {
|
|
1677
|
-
this.resetSlots(key, this.
|
|
1669
|
+
this.resetSlots(key, this.getRequiredSlots(pks));
|
|
1678
1670
|
}
|
|
1679
1671
|
getEntitiesByKey(key) {
|
|
1680
1672
|
return super.getEntitiesByKey(key);
|
|
@@ -1682,26 +1674,25 @@ var OIMCollectionIndexManualOrderedArrayBased = class extends OIMIndexManualOrde
|
|
|
1682
1674
|
getEntitiesByKeys(keys) {
|
|
1683
1675
|
return super.getEntitiesByKeys(keys);
|
|
1684
1676
|
}
|
|
1685
|
-
|
|
1686
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
@@ -2120,18 +2111,18 @@ var OIMOrderedListCommandStream = class extends OIMOrderedListCommandBuffer {
|
|
|
2120
2111
|
var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandStream {
|
|
2121
2112
|
constructor(queue, opts) {
|
|
2122
2113
|
const index = opts.index ?? new OIMCollectionIndexManualOrderedArrayBased(
|
|
2123
|
-
opts.collection !== void 0 ? { collection: opts.collection } : {
|
|
2114
|
+
opts.collection !== void 0 ? { collection: opts.collection } : { getSlot: opts.getSlot }
|
|
2124
2115
|
);
|
|
2125
2116
|
super(queue, index);
|
|
2126
2117
|
this.index = index;
|
|
2127
2118
|
}
|
|
2128
2119
|
push(key, pk) {
|
|
2129
|
-
const slot = this.
|
|
2120
|
+
const slot = this.getRequiredSlot(pk);
|
|
2130
2121
|
const index = this.index.pushSlot(key, slot);
|
|
2131
2122
|
this.appendCommand(key, { type: "insert", index, item: slot });
|
|
2132
2123
|
}
|
|
2133
2124
|
insertAt(key, index, pk) {
|
|
2134
|
-
const slot = this.
|
|
2125
|
+
const slot = this.getRequiredSlot(pk);
|
|
2135
2126
|
const safeIndex = this.index.insertSlotAt(key, index, slot);
|
|
2136
2127
|
this.appendCommand(key, {
|
|
2137
2128
|
type: "insert",
|
|
@@ -2141,7 +2132,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2141
2132
|
}
|
|
2142
2133
|
/** Replace the element at `index` with the slot for `pk`, in place. */
|
|
2143
2134
|
setAt(key, index, pk) {
|
|
2144
|
-
const slot = this.
|
|
2135
|
+
const slot = this.getRequiredSlot(pk);
|
|
2145
2136
|
const safeIndex = this.index.setSlotAt(key, index, slot);
|
|
2146
2137
|
if (safeIndex < 0) return;
|
|
2147
2138
|
this.appendCommand(key, {
|
|
@@ -2151,7 +2142,7 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2151
2142
|
});
|
|
2152
2143
|
}
|
|
2153
2144
|
set(key, pks) {
|
|
2154
|
-
const slots = pks.map((pk) => this.
|
|
2145
|
+
const slots = pks.map((pk) => this.getRequiredSlot(pk));
|
|
2155
2146
|
this.index.resetSlots(key, slots);
|
|
2156
2147
|
this.appendResetCommand(key, slots);
|
|
2157
2148
|
}
|
|
@@ -2163,8 +2154,8 @@ var OIMCollectionOrderedListCommandStream = class extends OIMOrderedListCommandS
|
|
|
2163
2154
|
getEntitiesByKey(key) {
|
|
2164
2155
|
return this.index.getEntitiesByKey(key);
|
|
2165
2156
|
}
|
|
2166
|
-
|
|
2167
|
-
return this.index.
|
|
2157
|
+
getRequiredSlot(pk) {
|
|
2158
|
+
return this.index.getRequiredSlot(
|
|
2168
2159
|
pk
|
|
2169
2160
|
);
|
|
2170
2161
|
}
|
|
@@ -2224,8 +2215,8 @@ var OIMIndexManualArrayBased = class extends OIMIndexArrayBased {
|
|
|
2224
2215
|
}
|
|
2225
2216
|
};
|
|
2226
2217
|
|
|
2227
|
-
// src/core/
|
|
2228
|
-
var
|
|
2218
|
+
// src/core/OIMBucketCarrierProvider.ts
|
|
2219
|
+
var OIMBucketCarrierProvider = class {
|
|
2229
2220
|
constructor(store) {
|
|
2230
2221
|
this.store = store;
|
|
2231
2222
|
}
|
|
@@ -2266,7 +2257,7 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
|
|
|
2266
2257
|
comparePks: opts?.indexOptions?.comparePks,
|
|
2267
2258
|
store
|
|
2268
2259
|
}),
|
|
2269
|
-
() => new
|
|
2260
|
+
() => new OIMBucketCarrierProvider(store)
|
|
2270
2261
|
);
|
|
2271
2262
|
}
|
|
2272
2263
|
setSlots(key, slots) {
|
|
@@ -2283,52 +2274,61 @@ var OIMReactiveIndexManualArrayBased = class extends OIMReactiveIndexArrayBased
|
|
|
2283
2274
|
// src/core/OIMReactiveCollectionIndexManualArrayBased.ts
|
|
2284
2275
|
var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexManualArrayBased {
|
|
2285
2276
|
constructor(queue, opts) {
|
|
2286
|
-
const
|
|
2287
|
-
const pkDomain = opts.collection?.keyDomain ?? new OIMKeyDomainNative();
|
|
2277
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2288
2278
|
super(queue, {
|
|
2289
2279
|
indexOptions: opts.indexOptions
|
|
2290
2280
|
});
|
|
2291
|
-
// Persistent per-key
|
|
2292
|
-
//
|
|
2293
|
-
|
|
2294
|
-
this.
|
|
2295
|
-
this.
|
|
2281
|
+
// Persistent per-key membership for O(1) `addPks` dedup, keyed by the
|
|
2282
|
+
// canonical slot reference (correct for composite pks with a native Set — no
|
|
2283
|
+
// content-addressing needed, since slots are one reference per logical key).
|
|
2284
|
+
this.slotsByKey = /* @__PURE__ */ new Map();
|
|
2285
|
+
this.getSlot = getSlot;
|
|
2286
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2296
2287
|
}
|
|
2297
2288
|
setPks(key, pks) {
|
|
2298
|
-
const
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
super.setSlots(key, this.resolveSlots(pks));
|
|
2289
|
+
const slots = this.getSlotsOrTransient(pks);
|
|
2290
|
+
this.slotsByKey.set(key, new Set(slots));
|
|
2291
|
+
super.setSlots(key, slots);
|
|
2302
2292
|
}
|
|
2303
2293
|
addPks(key, pks) {
|
|
2304
2294
|
if (pks.length === 0) return;
|
|
2305
|
-
const
|
|
2295
|
+
const slotSet = this.membershipOf(key);
|
|
2306
2296
|
const newSlots = [];
|
|
2307
2297
|
for (const pk of pks) {
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2298
|
+
const slot = this.getSlotOrTransient(pk);
|
|
2299
|
+
if (slotSet.has(slot)) continue;
|
|
2300
|
+
slotSet.add(slot);
|
|
2301
|
+
newSlots.push(slot);
|
|
2311
2302
|
}
|
|
2312
2303
|
if (newSlots.length > 0) this.appendSlots(key, newSlots);
|
|
2313
2304
|
}
|
|
2314
2305
|
removePks(key, pks) {
|
|
2315
2306
|
if (pks.length === 0) return;
|
|
2316
|
-
const
|
|
2307
|
+
const slotsToRemove = /* @__PURE__ */ new Set();
|
|
2308
|
+
const pksToRemove = /* @__PURE__ */ new Set();
|
|
2309
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2310
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2311
|
+
if (slot) slotsToRemove.add(slot);
|
|
2312
|
+
else pksToRemove.add(pks[i]);
|
|
2313
|
+
}
|
|
2317
2314
|
const existingSlots = this.index.getSlotsByKey(key);
|
|
2318
|
-
const
|
|
2319
|
-
|
|
2320
|
-
)
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2315
|
+
const slotSet = this.slotsByKey.get(key);
|
|
2316
|
+
const nextSlots = [];
|
|
2317
|
+
for (let i = 0; i < existingSlots.length; i++) {
|
|
2318
|
+
const slot = existingSlots[i];
|
|
2319
|
+
if (slotsToRemove.has(slot) || pksToRemove.has(slot.pk)) {
|
|
2320
|
+
slotSet?.delete(slot);
|
|
2321
|
+
} else {
|
|
2322
|
+
nextSlots.push(slot);
|
|
2323
|
+
}
|
|
2325
2324
|
}
|
|
2325
|
+
if (nextSlots.length === existingSlots.length) return;
|
|
2326
2326
|
if (nextSlots.length === 0) this.clear(key);
|
|
2327
2327
|
else super.setSlots(key, nextSlots);
|
|
2328
2328
|
}
|
|
2329
2329
|
clear(key) {
|
|
2330
|
-
if (key === void 0) this.
|
|
2331
|
-
else this.
|
|
2330
|
+
if (key === void 0) this.slotsByKey.clear();
|
|
2331
|
+
else this.slotsByKey.delete(key);
|
|
2332
2332
|
super.clear(key);
|
|
2333
2333
|
}
|
|
2334
2334
|
/**
|
|
@@ -2336,16 +2336,12 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2336
2336
|
* stays correct even if slots were set through a lower-level path.
|
|
2337
2337
|
*/
|
|
2338
2338
|
membershipOf(key) {
|
|
2339
|
-
let
|
|
2340
|
-
if (!
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
for (let i = 0; i < existing.length; i++) {
|
|
2344
|
-
pkSet.add(existing[i].pk);
|
|
2345
|
-
}
|
|
2346
|
-
this.pksByKey.set(key, pkSet);
|
|
2339
|
+
let slotSet = this.slotsByKey.get(key);
|
|
2340
|
+
if (!slotSet) {
|
|
2341
|
+
slotSet = new Set(this.index.getSlotsByKey(key));
|
|
2342
|
+
this.slotsByKey.set(key, slotSet);
|
|
2347
2343
|
}
|
|
2348
|
-
return
|
|
2344
|
+
return slotSet;
|
|
2349
2345
|
}
|
|
2350
2346
|
getEntitiesByKey(key) {
|
|
2351
2347
|
return super.getEntitiesByKey(key);
|
|
@@ -2353,16 +2349,16 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2353
2349
|
getEntitiesByKeys(keys) {
|
|
2354
2350
|
return super.getEntitiesByKeys(keys);
|
|
2355
2351
|
}
|
|
2356
|
-
|
|
2352
|
+
getSlotsOrTransient(pks) {
|
|
2357
2353
|
const slots = [];
|
|
2358
2354
|
slots.length = pks.length;
|
|
2359
2355
|
for (let i = 0; i < pks.length; i++) {
|
|
2360
|
-
slots[i] = this.
|
|
2356
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
2361
2357
|
}
|
|
2362
2358
|
return slots;
|
|
2363
2359
|
}
|
|
2364
|
-
|
|
2365
|
-
const slot = this.
|
|
2360
|
+
getSlotOrTransient(pk) {
|
|
2361
|
+
const slot = this.getSlot(pk);
|
|
2366
2362
|
if (!slot) return { pk, item: void 0 };
|
|
2367
2363
|
return slot;
|
|
2368
2364
|
}
|
|
@@ -2372,7 +2368,6 @@ var OIMReactiveCollectionIndexManualArrayBased = class extends OIMReactiveIndexM
|
|
|
2372
2368
|
var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
2373
2369
|
constructor(options = {}) {
|
|
2374
2370
|
super(options);
|
|
2375
|
-
this.pkDomain = options.pkDomain ?? new OIMKeyDomainNative();
|
|
2376
2371
|
}
|
|
2377
2372
|
setSlots(key, slots) {
|
|
2378
2373
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
@@ -2381,27 +2376,28 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2381
2376
|
// --- pk-oriented writes: resolve the bucket ONCE and use its own membership
|
|
2382
2377
|
// (pk → slot) for dedup/removal, so a composite (trie) key is walked a single
|
|
2383
2378
|
// time instead of once for the bucket and once for a separate membership map.
|
|
2384
|
-
setPks(key, pks,
|
|
2379
|
+
setPks(key, pks, getSlot) {
|
|
2385
2380
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
2386
2381
|
const slots = [];
|
|
2387
|
-
for (let i = 0; i < pks.length; i++) slots.push(
|
|
2382
|
+
for (let i = 0; i < pks.length; i++) slots.push(getSlot(pks[i]));
|
|
2388
2383
|
this.replaceBucketContents(bucket, slots);
|
|
2389
|
-
const membership = bucket.membership ?? (bucket.membership =
|
|
2384
|
+
const membership = bucket.membership ?? (bucket.membership = /* @__PURE__ */ new Map());
|
|
2390
2385
|
membership.clear();
|
|
2391
|
-
for (let i = 0; i <
|
|
2392
|
-
if (!membership.has(
|
|
2386
|
+
for (let i = 0; i < slots.length; i++) {
|
|
2387
|
+
if (!membership.has(slots[i].pk)) {
|
|
2388
|
+
membership.set(slots[i].pk, slots[i]);
|
|
2389
|
+
}
|
|
2393
2390
|
}
|
|
2394
2391
|
}
|
|
2395
|
-
addPks(key, pks,
|
|
2392
|
+
addPks(key, pks, getSlot) {
|
|
2396
2393
|
if (pks.length === 0) return;
|
|
2397
2394
|
const bucket = this.setStore.getOrReserveBucket(key);
|
|
2398
2395
|
const membership = this.membershipOf(bucket);
|
|
2399
2396
|
let changed = false;
|
|
2400
2397
|
for (let i = 0; i < pks.length; i++) {
|
|
2401
|
-
const
|
|
2402
|
-
if (membership.has(pk)) continue;
|
|
2403
|
-
|
|
2404
|
-
membership.set(pk, slot);
|
|
2398
|
+
const slot = getSlot(pks[i]);
|
|
2399
|
+
if (membership.has(slot.pk)) continue;
|
|
2400
|
+
membership.set(slot.pk, slot);
|
|
2405
2401
|
if (!bucket.has(slot)) {
|
|
2406
2402
|
bucket.add(slot);
|
|
2407
2403
|
changed = true;
|
|
@@ -2411,6 +2407,11 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2411
2407
|
this.setStore.retainBucket(bucket);
|
|
2412
2408
|
this.emitBucketChanged(bucket);
|
|
2413
2409
|
}
|
|
2410
|
+
/**
|
|
2411
|
+
* Removes by pk. `pks` must be canonical `slot.pk` references (membership is
|
|
2412
|
+
* keyed by them): for primitive pks that is just the pk; a collection-bound
|
|
2413
|
+
* composite index canonicalizes raw pks to `slot.pk` before calling this.
|
|
2414
|
+
*/
|
|
2414
2415
|
removePks(key, pks) {
|
|
2415
2416
|
if (pks.length === 0) return;
|
|
2416
2417
|
const bucket = this.setStore.findBucket(key);
|
|
@@ -2436,7 +2437,7 @@ var OIMIndexManualSetBased = class extends OIMIndexSetBased {
|
|
|
2436
2437
|
membershipOf(bucket) {
|
|
2437
2438
|
let membership = bucket.membership;
|
|
2438
2439
|
if (!membership) {
|
|
2439
|
-
membership =
|
|
2440
|
+
membership = /* @__PURE__ */ new Map();
|
|
2440
2441
|
bucket.membership = membership;
|
|
2441
2442
|
}
|
|
2442
2443
|
if (membership.size === 0 && bucket.size > 0) {
|
|
@@ -2545,10 +2546,9 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
|
|
|
2545
2546
|
queue,
|
|
2546
2547
|
(updateEmitter) => new OIMIndexManualSetBasedReactive(updateEmitter, {
|
|
2547
2548
|
comparePks: opts?.indexOptions?.comparePks,
|
|
2548
|
-
store
|
|
2549
|
-
pkDomain: opts?.pkDomain
|
|
2549
|
+
store
|
|
2550
2550
|
}),
|
|
2551
|
-
() => new
|
|
2551
|
+
() => new OIMBucketCarrierProvider(store)
|
|
2552
2552
|
);
|
|
2553
2553
|
}
|
|
2554
2554
|
setSlots(key, slots) {
|
|
@@ -2568,28 +2568,33 @@ var OIMReactiveIndexManualSetBased = class extends OIMReactiveIndexSetBased {
|
|
|
2568
2568
|
// src/core/OIMReactiveCollectionIndexManualSetBased.ts
|
|
2569
2569
|
var OIMReactiveCollectionIndexManualSetBased = class extends OIMReactiveIndexManualSetBased {
|
|
2570
2570
|
constructor(queue, opts) {
|
|
2571
|
-
const
|
|
2571
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2572
2572
|
super(queue, {
|
|
2573
|
-
indexOptions: opts.indexOptions
|
|
2574
|
-
pkDomain: opts.collection?.keyDomain
|
|
2573
|
+
indexOptions: opts.indexOptions
|
|
2575
2574
|
});
|
|
2576
2575
|
// Bound once so the hot pk-write path passes a stable function (no per-call
|
|
2577
2576
|
// closure allocation).
|
|
2578
|
-
this.
|
|
2579
|
-
const slot = this.
|
|
2577
|
+
this.getSlotOrTransient = (pk) => {
|
|
2578
|
+
const slot = this.getSlot(pk);
|
|
2580
2579
|
if (!slot) return { pk, item: void 0 };
|
|
2581
2580
|
return slot;
|
|
2582
2581
|
};
|
|
2583
|
-
this.
|
|
2582
|
+
this.getSlot = getSlot;
|
|
2583
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2584
2584
|
}
|
|
2585
2585
|
setPks(key, pks) {
|
|
2586
|
-
this.index.setPks(key, pks, this.
|
|
2586
|
+
this.index.setPks(key, pks, this.getSlotOrTransient);
|
|
2587
2587
|
}
|
|
2588
2588
|
addPks(key, pks) {
|
|
2589
|
-
this.index.addPks(key, pks, this.
|
|
2589
|
+
this.index.addPks(key, pks, this.getSlotOrTransient);
|
|
2590
2590
|
}
|
|
2591
2591
|
removePks(key, pks) {
|
|
2592
|
-
|
|
2592
|
+
const canonical = [];
|
|
2593
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2594
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2595
|
+
canonical.push(slot ? slot.pk : pks[i]);
|
|
2596
|
+
}
|
|
2597
|
+
this.index.removePks(key, canonical);
|
|
2593
2598
|
}
|
|
2594
2599
|
getEntitiesByKey(key) {
|
|
2595
2600
|
return super.getEntitiesByKey(key);
|
|
@@ -2798,29 +2803,34 @@ var OIMIndexStoreTrieDrivenSetBased = class extends OIMIndexStoreSetBased {
|
|
|
2798
2803
|
// src/core/OIMReactiveCollectionIndexCompositeTrieSetBased.ts
|
|
2799
2804
|
var OIMReactiveCollectionIndexCompositeTrieSetBased = class extends OIMReactiveIndexManualSetBased {
|
|
2800
2805
|
constructor(queue, opts) {
|
|
2801
|
-
const
|
|
2806
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2802
2807
|
super(queue, {
|
|
2803
2808
|
indexOptions: {
|
|
2804
2809
|
comparePks: opts.indexOptions?.comparePks,
|
|
2805
2810
|
store: opts.indexOptions?.store ?? new OIMIndexStoreTrieDrivenSetBased()
|
|
2806
|
-
}
|
|
2807
|
-
pkDomain: opts.collection?.keyDomain
|
|
2811
|
+
}
|
|
2808
2812
|
});
|
|
2809
|
-
this.
|
|
2810
|
-
const slot = this.
|
|
2813
|
+
this.getSlotOrTransient = (pk) => {
|
|
2814
|
+
const slot = this.getSlot(pk);
|
|
2811
2815
|
if (!slot) return { pk, item: void 0 };
|
|
2812
2816
|
return slot;
|
|
2813
2817
|
};
|
|
2814
|
-
this.
|
|
2818
|
+
this.getSlot = getSlot;
|
|
2819
|
+
this.findSlotForRemoval = opts.collection !== void 0 ? (pk) => opts.collection.findSlotByPk(pk) : opts.getSlot;
|
|
2815
2820
|
}
|
|
2816
2821
|
setPks(key, pks) {
|
|
2817
|
-
this.index.setPks(key, pks, this.
|
|
2822
|
+
this.index.setPks(key, pks, this.getSlotOrTransient);
|
|
2818
2823
|
}
|
|
2819
2824
|
addPks(key, pks) {
|
|
2820
|
-
this.index.addPks(key, pks, this.
|
|
2825
|
+
this.index.addPks(key, pks, this.getSlotOrTransient);
|
|
2821
2826
|
}
|
|
2822
2827
|
removePks(key, pks) {
|
|
2823
|
-
|
|
2828
|
+
const canonical = [];
|
|
2829
|
+
for (let i = 0; i < pks.length; i++) {
|
|
2830
|
+
const slot = this.findSlotForRemoval(pks[i]);
|
|
2831
|
+
canonical.push(slot ? slot.pk : pks[i]);
|
|
2832
|
+
}
|
|
2833
|
+
this.index.removePks(key, canonical);
|
|
2824
2834
|
}
|
|
2825
2835
|
getEntitiesByKey(key) {
|
|
2826
2836
|
return super.getEntitiesByKey(key);
|
|
@@ -2927,7 +2937,7 @@ var OIMIndexStoreTrieDrivenArrayBased = class extends OIMIndexStoreArrayBased {
|
|
|
2927
2937
|
// src/core/OIMReactiveCollectionIndexCompositeTrieArrayBased.ts
|
|
2928
2938
|
var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiveIndexManualArrayBased {
|
|
2929
2939
|
constructor(queue, opts) {
|
|
2930
|
-
const
|
|
2940
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
2931
2941
|
super(queue, {
|
|
2932
2942
|
indexOptions: {
|
|
2933
2943
|
comparePks: opts.indexOptions?.comparePks,
|
|
@@ -2937,13 +2947,13 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2937
2947
|
// Persistent per-key-path pk membership for O(1) `addPks` dedup. Trie-keyed
|
|
2938
2948
|
// so a rebuilt key path matches by content.
|
|
2939
2949
|
this.pksByKey = new OIMTrieMap();
|
|
2940
|
-
this.
|
|
2950
|
+
this.getSlot = getSlot;
|
|
2941
2951
|
}
|
|
2942
2952
|
setPks(key, pks) {
|
|
2943
2953
|
const pkSet = /* @__PURE__ */ new Set();
|
|
2944
2954
|
for (let i = 0; i < pks.length; i++) pkSet.add(pks[i]);
|
|
2945
2955
|
this.pksByKey.set(key, pkSet);
|
|
2946
|
-
super.setSlots(key, this.
|
|
2956
|
+
super.setSlots(key, this.getSlotsOrTransient(pks));
|
|
2947
2957
|
}
|
|
2948
2958
|
addPks(key, pks) {
|
|
2949
2959
|
if (pks.length === 0) return;
|
|
@@ -2952,7 +2962,7 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2952
2962
|
for (const pk of pks) {
|
|
2953
2963
|
if (pkSet.has(pk)) continue;
|
|
2954
2964
|
pkSet.add(pk);
|
|
2955
|
-
newSlots.push(this.
|
|
2965
|
+
newSlots.push(this.getSlotOrTransient(pk));
|
|
2956
2966
|
}
|
|
2957
2967
|
if (newSlots.length > 0) this.appendSlots(key, newSlots);
|
|
2958
2968
|
}
|
|
@@ -2998,16 +3008,16 @@ var OIMReactiveCollectionIndexCompositeTrieArrayBased = class extends OIMReactiv
|
|
|
2998
3008
|
getEntitiesByKeys(keys) {
|
|
2999
3009
|
return super.getEntitiesByKeys(keys);
|
|
3000
3010
|
}
|
|
3001
|
-
|
|
3011
|
+
getSlotsOrTransient(pks) {
|
|
3002
3012
|
const slots = [];
|
|
3003
3013
|
slots.length = pks.length;
|
|
3004
3014
|
for (let i = 0; i < pks.length; i++) {
|
|
3005
|
-
slots[i] = this.
|
|
3015
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
3006
3016
|
}
|
|
3007
3017
|
return slots;
|
|
3008
3018
|
}
|
|
3009
|
-
|
|
3010
|
-
const slot = this.
|
|
3019
|
+
getSlotOrTransient(pk) {
|
|
3020
|
+
const slot = this.getSlot(pk);
|
|
3011
3021
|
if (!slot) return { pk, item: void 0 };
|
|
3012
3022
|
return slot;
|
|
3013
3023
|
}
|
|
@@ -3320,20 +3330,20 @@ var OIMReactiveGlobalIndexManualArrayBased = class extends OIMReactiveGlobalInde
|
|
|
3320
3330
|
// src/core/OIMReactiveCollectionGlobalIndexManualArrayBased.ts
|
|
3321
3331
|
var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactiveGlobalIndexManualArrayBased {
|
|
3322
3332
|
constructor(queue, opts) {
|
|
3323
|
-
const
|
|
3333
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
3324
3334
|
super(queue, { indexOptions: opts.indexOptions });
|
|
3325
3335
|
// Single pk membership set for O(1) `addPks` dedup. Lazily seeded from the
|
|
3326
3336
|
// bucket so it stays correct even after a raw `setSlots` (e.g. derived
|
|
3327
3337
|
// rebuild), matching the keyed index's `membershipOf`.
|
|
3328
3338
|
this.membership = /* @__PURE__ */ new Set();
|
|
3329
3339
|
this.membershipSeeded = false;
|
|
3330
|
-
this.
|
|
3340
|
+
this.getSlot = getSlot;
|
|
3331
3341
|
}
|
|
3332
3342
|
setPks(pks) {
|
|
3333
3343
|
this.membership.clear();
|
|
3334
3344
|
for (let i = 0; i < pks.length; i++) this.membership.add(pks[i]);
|
|
3335
3345
|
this.membershipSeeded = true;
|
|
3336
|
-
super.setSlots(this.
|
|
3346
|
+
super.setSlots(this.getSlotsOrTransient(pks));
|
|
3337
3347
|
}
|
|
3338
3348
|
addPks(pks) {
|
|
3339
3349
|
if (pks.length === 0) return;
|
|
@@ -3342,7 +3352,7 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
|
|
|
3342
3352
|
for (const pk of pks) {
|
|
3343
3353
|
if (membership.has(pk)) continue;
|
|
3344
3354
|
membership.add(pk);
|
|
3345
|
-
newSlots.push(this.
|
|
3355
|
+
newSlots.push(this.getSlotOrTransient(pk));
|
|
3346
3356
|
}
|
|
3347
3357
|
if (newSlots.length > 0) super.appendSlots(newSlots);
|
|
3348
3358
|
}
|
|
@@ -3379,16 +3389,16 @@ var OIMReactiveCollectionGlobalIndexManualArrayBased = class extends OIMReactive
|
|
|
3379
3389
|
getEntities() {
|
|
3380
3390
|
return super.getEntities();
|
|
3381
3391
|
}
|
|
3382
|
-
|
|
3392
|
+
getSlotsOrTransient(pks) {
|
|
3383
3393
|
const slots = [];
|
|
3384
3394
|
slots.length = pks.length;
|
|
3385
3395
|
for (let i = 0; i < pks.length; i++) {
|
|
3386
|
-
slots[i] = this.
|
|
3396
|
+
slots[i] = this.getSlotOrTransient(pks[i]);
|
|
3387
3397
|
}
|
|
3388
3398
|
return slots;
|
|
3389
3399
|
}
|
|
3390
|
-
|
|
3391
|
-
const slot = this.
|
|
3400
|
+
getSlotOrTransient(pk) {
|
|
3401
|
+
const slot = this.getSlot(pk);
|
|
3392
3402
|
if (!slot) return { pk, item: void 0 };
|
|
3393
3403
|
return slot;
|
|
3394
3404
|
}
|
|
@@ -3468,18 +3478,18 @@ var OIMReactiveGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexS
|
|
|
3468
3478
|
// src/core/OIMReactiveCollectionGlobalIndexManualSetBased.ts
|
|
3469
3479
|
var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGlobalIndexManualSetBased {
|
|
3470
3480
|
constructor(queue, opts) {
|
|
3471
|
-
const
|
|
3481
|
+
const getSlot = opts.collection !== void 0 ? (pk) => opts.collection.getOrReserveSlotByPk(pk) : opts.getSlot;
|
|
3472
3482
|
super(queue, { indexOptions: opts.indexOptions });
|
|
3473
3483
|
this.membership = /* @__PURE__ */ new Map();
|
|
3474
3484
|
this.membershipSeeded = false;
|
|
3475
|
-
this.
|
|
3485
|
+
this.getSlot = getSlot;
|
|
3476
3486
|
}
|
|
3477
3487
|
setPks(pks) {
|
|
3478
3488
|
this.membership.clear();
|
|
3479
3489
|
const slots = [];
|
|
3480
3490
|
for (let i = 0; i < pks.length; i++) {
|
|
3481
3491
|
const pk = pks[i];
|
|
3482
|
-
const slot = this.
|
|
3492
|
+
const slot = this.getSlotOrTransient(pk);
|
|
3483
3493
|
if (!this.membership.has(pk)) this.membership.set(pk, slot);
|
|
3484
3494
|
slots.push(slot);
|
|
3485
3495
|
}
|
|
@@ -3492,7 +3502,7 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
|
|
|
3492
3502
|
const newSlots = [];
|
|
3493
3503
|
for (const pk of pks) {
|
|
3494
3504
|
if (membership.has(pk)) continue;
|
|
3495
|
-
const slot = this.
|
|
3505
|
+
const slot = this.getSlotOrTransient(pk);
|
|
3496
3506
|
membership.set(pk, slot);
|
|
3497
3507
|
newSlots.push(slot);
|
|
3498
3508
|
}
|
|
@@ -3531,8 +3541,8 @@ var OIMReactiveCollectionGlobalIndexManualSetBased = class extends OIMReactiveGl
|
|
|
3531
3541
|
getEntities() {
|
|
3532
3542
|
return super.getEntities();
|
|
3533
3543
|
}
|
|
3534
|
-
|
|
3535
|
-
const slot = this.
|
|
3544
|
+
getSlotOrTransient(pk) {
|
|
3545
|
+
const slot = this.getSlot(pk);
|
|
3536
3546
|
if (!slot) return { pk, item: void 0 };
|
|
3537
3547
|
return slot;
|
|
3538
3548
|
}
|
|
@@ -3941,7 +3951,7 @@ var OIMObject = class {
|
|
|
3941
3951
|
var OIMReactiveObject = class extends OIMObject {
|
|
3942
3952
|
constructor(queue, opts) {
|
|
3943
3953
|
super(opts);
|
|
3944
|
-
this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new
|
|
3954
|
+
this.updateEmitter = new OIMCarrierKeyedEmitter(queue, new OIMKeyedCarrierProvider());
|
|
3945
3955
|
}
|
|
3946
3956
|
/**
|
|
3947
3957
|
* Mark the written key(s) on the keyed emitter directly — no general-event
|
|
@@ -3983,57 +3993,10 @@ var OIMReactiveObject = class extends OIMObject {
|
|
|
3983
3993
|
}
|
|
3984
3994
|
};
|
|
3985
3995
|
|
|
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
3996
|
// src/core/OIMCollectionStoreTrieDriven.ts
|
|
4033
3997
|
var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
4034
|
-
constructor(
|
|
4035
|
-
super();
|
|
4036
|
-
this.keyDomain = keyDomain;
|
|
3998
|
+
constructor() {
|
|
3999
|
+
super(...arguments);
|
|
4037
4000
|
this.slots = new OIMTrieMap();
|
|
4038
4001
|
this.reservedSlots = new OIMTrieMap();
|
|
4039
4002
|
}
|
|
@@ -4051,7 +4014,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
|
4051
4014
|
return reserved;
|
|
4052
4015
|
}
|
|
4053
4016
|
const nextSlot = {
|
|
4054
|
-
pk
|
|
4017
|
+
pk,
|
|
4055
4018
|
item: entity
|
|
4056
4019
|
};
|
|
4057
4020
|
this.slots.set(pk, nextSlot);
|
|
@@ -4062,7 +4025,7 @@ var OIMCollectionStoreTrieDriven = class extends OIMCollectionStore {
|
|
|
4062
4025
|
if (slot) return slot;
|
|
4063
4026
|
let reserved = this.reservedSlots.get(pk);
|
|
4064
4027
|
if (!reserved) {
|
|
4065
|
-
reserved = { pk
|
|
4028
|
+
reserved = { pk, item: void 0 };
|
|
4066
4029
|
this.reservedSlots.set(pk, reserved);
|
|
4067
4030
|
}
|
|
4068
4031
|
return reserved;
|
|
@@ -4219,8 +4182,8 @@ var OIMObjectStoreMapDriven = class extends OIMObjectStore {
|
|
|
4219
4182
|
}
|
|
4220
4183
|
};
|
|
4221
4184
|
|
|
4222
|
-
// src/core/
|
|
4223
|
-
var
|
|
4185
|
+
// src/core/OIMKeyPathCarrierProvider.ts
|
|
4186
|
+
var OIMKeyPathCarrierProvider = class {
|
|
4224
4187
|
constructor() {
|
|
4225
4188
|
this.carriers = new OIMTrieMap();
|
|
4226
4189
|
}
|
|
@@ -4520,6 +4483,31 @@ function createOIMDisposeScope() {
|
|
|
4520
4483
|
return new OIMDisposeScope();
|
|
4521
4484
|
}
|
|
4522
4485
|
|
|
4486
|
+
// src/core/OIMTrieSet.ts
|
|
4487
|
+
var OIMTrieSet = class {
|
|
4488
|
+
constructor() {
|
|
4489
|
+
this.map = new OIMTrieMap();
|
|
4490
|
+
}
|
|
4491
|
+
get size() {
|
|
4492
|
+
return this.map.size;
|
|
4493
|
+
}
|
|
4494
|
+
add(key) {
|
|
4495
|
+
this.map.set(key, true);
|
|
4496
|
+
}
|
|
4497
|
+
has(key) {
|
|
4498
|
+
return this.map.has(key);
|
|
4499
|
+
}
|
|
4500
|
+
delete(key) {
|
|
4501
|
+
return this.map.delete(key);
|
|
4502
|
+
}
|
|
4503
|
+
*values() {
|
|
4504
|
+
yield* this.map.keys();
|
|
4505
|
+
}
|
|
4506
|
+
clear() {
|
|
4507
|
+
this.map.clear();
|
|
4508
|
+
}
|
|
4509
|
+
};
|
|
4510
|
+
|
|
4523
4511
|
// src/core/OIMPkCodecKeyPath.ts
|
|
4524
4512
|
var OIMPkCodecKeyPath = class {
|
|
4525
4513
|
encode(pk) {
|
|
@@ -6167,35 +6155,20 @@ var OIMComputed = class {
|
|
|
6167
6155
|
};
|
|
6168
6156
|
|
|
6169
6157
|
// src/modules/effect/core/OIMEffectDependencyKeyed.ts
|
|
6170
|
-
function isReadonlyArray(value) {
|
|
6171
|
-
return Array.isArray(value);
|
|
6172
|
-
}
|
|
6173
6158
|
var OIMEffectDependencyKeyed = class {
|
|
6174
|
-
constructor(source,
|
|
6159
|
+
constructor(source, key) {
|
|
6175
6160
|
this.source = source;
|
|
6176
|
-
|
|
6177
|
-
this.keys = keyOrKeys;
|
|
6178
|
-
} else {
|
|
6179
|
-
this.key = keyOrKeys;
|
|
6180
|
-
}
|
|
6161
|
+
this.key = key;
|
|
6181
6162
|
}
|
|
6182
6163
|
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
6164
|
return this.source.subscribeOnKey(this.key, onUpdate);
|
|
6189
6165
|
}
|
|
6190
6166
|
};
|
|
6191
6167
|
|
|
6192
6168
|
// src/modules/effect/core/OIMEffectDependencyKeyedObject.ts
|
|
6193
6169
|
var OIMEffectDependencyKeyedObject = class {
|
|
6194
|
-
constructor(object,
|
|
6195
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6196
|
-
object,
|
|
6197
|
-
keyOrKeys
|
|
6198
|
-
);
|
|
6170
|
+
constructor(object, key) {
|
|
6171
|
+
this.dep = new OIMEffectDependencyKeyed(object, key);
|
|
6199
6172
|
}
|
|
6200
6173
|
get source() {
|
|
6201
6174
|
return this.dep.source;
|
|
@@ -6207,11 +6180,8 @@ var OIMEffectDependencyKeyedObject = class {
|
|
|
6207
6180
|
|
|
6208
6181
|
// src/modules/effect/core/OIMEffectDependencyKeyedCollection.ts
|
|
6209
6182
|
var OIMEffectDependencyKeyedCollection = class {
|
|
6210
|
-
constructor(collection,
|
|
6211
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6212
|
-
collection,
|
|
6213
|
-
pkOrPks
|
|
6214
|
-
);
|
|
6183
|
+
constructor(collection, pk) {
|
|
6184
|
+
this.dep = new OIMEffectDependencyKeyed(collection, pk);
|
|
6215
6185
|
}
|
|
6216
6186
|
get source() {
|
|
6217
6187
|
return this.dep.source;
|
|
@@ -6223,11 +6193,8 @@ var OIMEffectDependencyKeyedCollection = class {
|
|
|
6223
6193
|
|
|
6224
6194
|
// src/modules/effect/core/OIMEffectDependencyKeyedIndex.ts
|
|
6225
6195
|
var OIMEffectDependencyKeyedIndex = class {
|
|
6226
|
-
constructor(index,
|
|
6227
|
-
this.dep = new OIMEffectDependencyKeyed(
|
|
6228
|
-
index,
|
|
6229
|
-
keyOrKeys
|
|
6230
|
-
);
|
|
6196
|
+
constructor(index, key) {
|
|
6197
|
+
this.dep = new OIMEffectDependencyKeyed(index, key);
|
|
6231
6198
|
}
|
|
6232
6199
|
get source() {
|
|
6233
6200
|
return this.dep.source;
|
|
@@ -6374,7 +6341,7 @@ export {
|
|
|
6374
6341
|
EOIMEventQueueSchedulerEventType,
|
|
6375
6342
|
EOIMIndexEventType,
|
|
6376
6343
|
EOIMObjectEventType,
|
|
6377
|
-
|
|
6344
|
+
OIMBucketCarrierProvider,
|
|
6378
6345
|
OIMCarrierKeyedEmitter,
|
|
6379
6346
|
OIMCarrierSingleEmitter,
|
|
6380
6347
|
OIMCollection,
|
|
@@ -6441,9 +6408,7 @@ export {
|
|
|
6441
6408
|
OIMIndexStoreSetBased,
|
|
6442
6409
|
OIMIndexStoreTrieDrivenArrayBased,
|
|
6443
6410
|
OIMIndexStoreTrieDrivenSetBased,
|
|
6444
|
-
|
|
6445
|
-
OIMKeyDomainTrie,
|
|
6446
|
-
OIMKeyPathCarrierResolver,
|
|
6411
|
+
OIMKeyPathCarrierProvider,
|
|
6447
6412
|
OIMKeyedBucketArrayBased,
|
|
6448
6413
|
OIMKeyedBucketSetBased,
|
|
6449
6414
|
OIMMap2Keys,
|