@ecsia/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/bitmask/bitmask.d.ts +21 -0
- package/dist/bitmask/bitmask.d.ts.map +1 -0
- package/dist/bitmask/bitmask.js +103 -0
- package/dist/bitmask/bitmask.js.map +1 -0
- package/dist/bitmask/index.d.ts +3 -0
- package/dist/bitmask/index.d.ts.map +1 -0
- package/dist/bitmask/index.js +2 -0
- package/dist/bitmask/index.js.map +1 -0
- package/dist/component/accessor.d.ts +40 -0
- package/dist/component/accessor.d.ts.map +1 -0
- package/dist/component/accessor.js +220 -0
- package/dist/component/accessor.js.map +1 -0
- package/dist/component/column-set.d.ts +20 -0
- package/dist/component/column-set.d.ts.map +1 -0
- package/dist/component/column-set.js +60 -0
- package/dist/component/column-set.js.map +1 -0
- package/dist/component/define.d.ts +23 -0
- package/dist/component/define.d.ts.map +1 -0
- package/dist/component/define.js +155 -0
- package/dist/component/define.js.map +1 -0
- package/dist/component/descriptors.d.ts +3 -0
- package/dist/component/descriptors.d.ts.map +1 -0
- package/dist/component/descriptors.js +147 -0
- package/dist/component/descriptors.js.map +1 -0
- package/dist/component/index.d.ts +10 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +6 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/sidecar.d.ts +58 -0
- package/dist/component/sidecar.d.ts.map +1 -0
- package/dist/component/sidecar.js +136 -0
- package/dist/component/sidecar.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/entity/codec.d.ts +45 -0
- package/dist/entity/codec.d.ts.map +1 -0
- package/dist/entity/codec.js +53 -0
- package/dist/entity/codec.js.map +1 -0
- package/dist/entity/index-allocator.d.ts +46 -0
- package/dist/entity/index-allocator.d.ts.map +1 -0
- package/dist/entity/index-allocator.js +121 -0
- package/dist/entity/index-allocator.js.map +1 -0
- package/dist/entity/index.d.ts +13 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +7 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/record.d.ts +28 -0
- package/dist/entity/record.d.ts.map +1 -0
- package/dist/entity/record.js +42 -0
- package/dist/entity/record.js.map +1 -0
- package/dist/entity/ref.d.ts +70 -0
- package/dist/entity/ref.d.ts.map +1 -0
- package/dist/entity/ref.js +104 -0
- package/dist/entity/ref.js.map +1 -0
- package/dist/entity/reservation.d.ts +12 -0
- package/dist/entity/reservation.d.ts.map +1 -0
- package/dist/entity/reservation.js +28 -0
- package/dist/entity/reservation.js.map +1 -0
- package/dist/entity/store.d.ts +60 -0
- package/dist/entity/store.d.ts.map +1 -0
- package/dist/entity/store.js +193 -0
- package/dist/entity/store.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +12 -0
- package/dist/env.js.map +1 -0
- package/dist/ids.d.ts +9 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +8 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-surface.d.ts +27 -0
- package/dist/inspect-surface.d.ts.map +1 -0
- package/dist/inspect-surface.js +14 -0
- package/dist/inspect-surface.js.map +1 -0
- package/dist/internal.d.ts +19 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +19 -0
- package/dist/internal.js.map +1 -0
- package/dist/memory/allocU32.d.ts +25 -0
- package/dist/memory/allocU32.d.ts.map +1 -0
- package/dist/memory/allocU32.js +95 -0
- package/dist/memory/allocU32.js.map +1 -0
- package/dist/memory/buffers.d.ts +94 -0
- package/dist/memory/buffers.d.ts.map +1 -0
- package/dist/memory/buffers.js +308 -0
- package/dist/memory/buffers.js.map +1 -0
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +4 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/layout.d.ts +37 -0
- package/dist/memory/layout.d.ts.map +1 -0
- package/dist/memory/layout.js +116 -0
- package/dist/memory/layout.js.map +1 -0
- package/dist/query/compile.d.ts +73 -0
- package/dist/query/compile.d.ts.map +1 -0
- package/dist/query/compile.js +158 -0
- package/dist/query/compile.js.map +1 -0
- package/dist/query/engine.d.ts +48 -0
- package/dist/query/engine.d.ts.map +1 -0
- package/dist/query/engine.js +230 -0
- package/dist/query/engine.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/live-query.d.ts +122 -0
- package/dist/query/live-query.d.ts.map +1 -0
- package/dist/query/live-query.js +543 -0
- package/dist/query/live-query.js.map +1 -0
- package/dist/query/sparse-set.d.ts +18 -0
- package/dist/query/sparse-set.d.ts.map +1 -0
- package/dist/query/sparse-set.js +126 -0
- package/dist/query/sparse-set.js.map +1 -0
- package/dist/reactivity/change-version.d.ts +19 -0
- package/dist/reactivity/change-version.d.ts.map +1 -0
- package/dist/reactivity/change-version.js +76 -0
- package/dist/reactivity/change-version.js.map +1 -0
- package/dist/reactivity/index.d.ts +12 -0
- package/dist/reactivity/index.d.ts.map +1 -0
- package/dist/reactivity/index.js +12 -0
- package/dist/reactivity/index.js.map +1 -0
- package/dist/reactivity/log.d.ts +83 -0
- package/dist/reactivity/log.d.ts.map +1 -0
- package/dist/reactivity/log.js +260 -0
- package/dist/reactivity/log.js.map +1 -0
- package/dist/reactivity/observer-commands.d.ts +40 -0
- package/dist/reactivity/observer-commands.d.ts.map +1 -0
- package/dist/reactivity/observer-commands.js +111 -0
- package/dist/reactivity/observer-commands.js.map +1 -0
- package/dist/reactivity/observers.d.ts +50 -0
- package/dist/reactivity/observers.d.ts.map +1 -0
- package/dist/reactivity/observers.js +127 -0
- package/dist/reactivity/observers.js.map +1 -0
- package/dist/reactivity/reactivity.d.ts +141 -0
- package/dist/reactivity/reactivity.d.ts.map +1 -0
- package/dist/reactivity/reactivity.js +479 -0
- package/dist/reactivity/reactivity.js.map +1 -0
- package/dist/reactivity/structural-journal.d.ts +30 -0
- package/dist/reactivity/structural-journal.d.ts.map +1 -0
- package/dist/reactivity/structural-journal.js +77 -0
- package/dist/reactivity/structural-journal.js.map +1 -0
- package/dist/registry.d.ts +26 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +58 -0
- package/dist/registry.js.map +1 -0
- package/dist/serialize-surface.d.ts +170 -0
- package/dist/serialize-surface.d.ts.map +1 -0
- package/dist/serialize-surface.js +6 -0
- package/dist/serialize-surface.js.map +1 -0
- package/dist/storage/archetype.d.ts +38 -0
- package/dist/storage/archetype.d.ts.map +1 -0
- package/dist/storage/archetype.js +47 -0
- package/dist/storage/archetype.js.map +1 -0
- package/dist/storage/cold-store.d.ts +41 -0
- package/dist/storage/cold-store.d.ts.map +1 -0
- package/dist/storage/cold-store.js +100 -0
- package/dist/storage/cold-store.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/signature.d.ts +27 -0
- package/dist/storage/signature.d.ts.map +1 -0
- package/dist/storage/signature.js +115 -0
- package/dist/storage/signature.js.map +1 -0
- package/dist/storage/storage.d.ts +72 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +192 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/store.d.ts +88 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +473 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/util/stable-index.d.ts +29 -0
- package/dist/util/stable-index.d.ts.map +1 -0
- package/dist/util/stable-index.js +51 -0
- package/dist/util/stable-index.js.map +1 -0
- package/dist/world.d.ts +262 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.js +831 -0
- package/dist/world.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
// LiveQuery: the cached runtime object for one canonical query hash. Owns the
|
|
2
|
+
// matchingArchetypes pointer cache (kept current by the archetypeCreated hook + the seed), the
|
|
3
|
+
// `current` sparse-set result container, and the per-value-signature cursor/element bindings that
|
|
4
|
+
// surface the accessor singletons during iteration.
|
|
5
|
+
//
|
|
6
|
+
// Matching state (current, matchingArchetypes, maintenance) is SHARED across value-signatures by
|
|
7
|
+
// hash; only the cursor/element binding is per value-signature. Iteration walks the
|
|
8
|
+
// matchingArchetypes contiguous rows (the hot path, O(A) matched at archetype creation, NOT per
|
|
9
|
+
// entity) and pokes the per-(archetype, component) accessor singleton — zero allocation per row.
|
|
10
|
+
var _a;
|
|
11
|
+
import { decodeEid } from '../memory/index.js';
|
|
12
|
+
const NO_HANDLE = 0xffffffff;
|
|
13
|
+
export class LiveQuery {
|
|
14
|
+
compiled;
|
|
15
|
+
terms;
|
|
16
|
+
matchingArchetypes = [];
|
|
17
|
+
current;
|
|
18
|
+
#byId;
|
|
19
|
+
#deps;
|
|
20
|
+
#bindings = new Map();
|
|
21
|
+
#delta = null;
|
|
22
|
+
#reactivity = null;
|
|
23
|
+
#changedDeclared = false;
|
|
24
|
+
#chunk = null;
|
|
25
|
+
lastMatchTick = 0;
|
|
26
|
+
constructor(compiled, terms, current, byId, deps) {
|
|
27
|
+
this.compiled = compiled;
|
|
28
|
+
this.terms = terms;
|
|
29
|
+
this.current = current;
|
|
30
|
+
this.#byId = byId;
|
|
31
|
+
this.#deps = deps;
|
|
32
|
+
}
|
|
33
|
+
get count() {
|
|
34
|
+
return this.current.size;
|
|
35
|
+
}
|
|
36
|
+
// --- flavor declaration ----------------------------------
|
|
37
|
+
#ensureDelta() {
|
|
38
|
+
if (this.#delta === null) {
|
|
39
|
+
this.#delta = { added: new Set(), removed: new Map(), hasAdded: false, hasRemoved: false };
|
|
40
|
+
}
|
|
41
|
+
return this.#delta;
|
|
42
|
+
}
|
|
43
|
+
/** Chainable flavor declarations. Allocate nothing for undeclared flavors. */
|
|
44
|
+
added() {
|
|
45
|
+
this.#ensureDelta().hasAdded = true;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
removed() {
|
|
49
|
+
this.#ensureDelta().hasRemoved = true;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
/** Install the reactivity write-log hooks (world wiring); enables the Changed flavor. */
|
|
53
|
+
__setReactivity(hooks) {
|
|
54
|
+
this.#reactivity = hooks;
|
|
55
|
+
if (this.#changedDeclared)
|
|
56
|
+
this.#attachChanged();
|
|
57
|
+
}
|
|
58
|
+
changed(...components) {
|
|
59
|
+
// The Changed flavor drains the reactivity WRITE LOG (not changeVersion). The filtered
|
|
60
|
+
// component set is the explicit `components` argument, or the query's whole referenced set when
|
|
61
|
+
// omitted.
|
|
62
|
+
this.#ensureDelta();
|
|
63
|
+
this.#changedDeclared = true;
|
|
64
|
+
this.#changedComponents = this.#resolveChangedComponents(components);
|
|
65
|
+
this.#attachChanged();
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
#changedComponents = [];
|
|
69
|
+
#resolveChangedComponents(components) {
|
|
70
|
+
if (components.length === 0)
|
|
71
|
+
return this.compiled.referencedIds;
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const c of components) {
|
|
74
|
+
const id = c.id;
|
|
75
|
+
if (typeof id === 'number')
|
|
76
|
+
out.push(id);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
#attachChanged() {
|
|
81
|
+
if (this.#reactivity === null || !this.#changedDeclared)
|
|
82
|
+
return;
|
|
83
|
+
this.#reactivity.attachChangedFlavor(this, this.#changedComponents);
|
|
84
|
+
}
|
|
85
|
+
/** Reset per-frame transient flavor lists (FRAME_RESET). */
|
|
86
|
+
frameReset() {
|
|
87
|
+
if (this.#delta !== null) {
|
|
88
|
+
this.#delta.added.clear();
|
|
89
|
+
this.#delta.removed.clear();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// --- value-signature bindings ------------------------------
|
|
93
|
+
/** The value-role signature: the P/W-tagged value subset, read-vs-write distinguished. */
|
|
94
|
+
static valueSignature(compiled) {
|
|
95
|
+
if (compiled.valueTerms.length === 0)
|
|
96
|
+
return '';
|
|
97
|
+
const parts = compiled.valueTerms.map((vt) => vt.role + ':' + vt.componentId);
|
|
98
|
+
parts.sort();
|
|
99
|
+
return parts.join('|');
|
|
100
|
+
}
|
|
101
|
+
ensureValueSignature(compiled) {
|
|
102
|
+
const sig = _a.valueSignature(compiled);
|
|
103
|
+
if (this.#bindings.has(sig))
|
|
104
|
+
return;
|
|
105
|
+
this.#bindings.set(sig, {
|
|
106
|
+
valueTerms: compiled.valueTerms,
|
|
107
|
+
elements: new Map(),
|
|
108
|
+
accessors: new Map(),
|
|
109
|
+
coldElements: new Map(),
|
|
110
|
+
coldSlots: new Map(),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** This query's own value-signature binding (the hot path uses one fixed signature for its lifetime).
|
|
114
|
+
* Resolved once and cached so `each`/iterator never re-sort+join the value signature per call. */
|
|
115
|
+
#hotBindingCache = null;
|
|
116
|
+
#hotBinding() {
|
|
117
|
+
let b = this.#hotBindingCache;
|
|
118
|
+
if (b === null) {
|
|
119
|
+
b = this.#binding(_a.valueSignature(this.compiled));
|
|
120
|
+
this.#hotBindingCache = b;
|
|
121
|
+
}
|
|
122
|
+
return b;
|
|
123
|
+
}
|
|
124
|
+
#binding(sig) {
|
|
125
|
+
let b = this.#bindings.get(sig);
|
|
126
|
+
if (b === undefined) {
|
|
127
|
+
b = {
|
|
128
|
+
valueTerms: this.compiled.valueTerms,
|
|
129
|
+
elements: new Map(),
|
|
130
|
+
accessors: new Map(),
|
|
131
|
+
coldElements: new Map(),
|
|
132
|
+
coldSlots: new Map(),
|
|
133
|
+
};
|
|
134
|
+
this.#bindings.set(sig, b);
|
|
135
|
+
}
|
|
136
|
+
return b;
|
|
137
|
+
}
|
|
138
|
+
// --- matching-set maintenance -----------------------
|
|
139
|
+
/** Append a newly-created (or seeded) archetype to the pointer cache. */
|
|
140
|
+
addMatchingArchetype(arch) {
|
|
141
|
+
this.matchingArchetypes.push(arch);
|
|
142
|
+
}
|
|
143
|
+
/**: add an entity index to `current`, recording a NET `added` delta where declared. */
|
|
144
|
+
addEntity(index) {
|
|
145
|
+
if (this.current.has(index))
|
|
146
|
+
return;
|
|
147
|
+
this.current.add(index);
|
|
148
|
+
const d = this.#delta;
|
|
149
|
+
if (d === null)
|
|
150
|
+
return;
|
|
151
|
+
if (d.removed.delete(index))
|
|
152
|
+
return; // remove-then-add this frame → net no-op
|
|
153
|
+
if (d.hasAdded)
|
|
154
|
+
d.added.add(index);
|
|
155
|
+
}
|
|
156
|
+
/**: remove an entity index from `current`, recording a NET `removed` delta where declared. */
|
|
157
|
+
removeEntity(index) {
|
|
158
|
+
if (!this.current.has(index))
|
|
159
|
+
return;
|
|
160
|
+
this.current.remove(index);
|
|
161
|
+
const d = this.#delta;
|
|
162
|
+
if (d === null)
|
|
163
|
+
return;
|
|
164
|
+
if (d.added.delete(index))
|
|
165
|
+
return; // add-then-remove this frame → net no-op
|
|
166
|
+
// Capture the handle now: the entity is still alive (freeEntity runs after this drop), so
|
|
167
|
+
// handleOf(index) resolves the dying entity's own generation rather than the recycled next one.
|
|
168
|
+
if (d.hasRemoved)
|
|
169
|
+
d.removed.set(index, this.#deps.handleOf(index));
|
|
170
|
+
}
|
|
171
|
+
// --- iteration ---------------------------------------------
|
|
172
|
+
/**
|
|
173
|
+
* (a): an exclusive specific-target pair matches the archetype by `presenceId(R)`
|
|
174
|
+
* (a signature bit) but the target is a COLUMN value — so each row is filtered by
|
|
175
|
+
* `targetColumn[row] === target`. Returns true when the query has no row filters (the common case).
|
|
176
|
+
*/
|
|
177
|
+
#passesRowFilters(arch, row) {
|
|
178
|
+
const filters = this.compiled.rowFilters;
|
|
179
|
+
if (filters.length === 0)
|
|
180
|
+
return true;
|
|
181
|
+
for (const rf of filters) {
|
|
182
|
+
const cs = arch.columnSets.get(rf.presenceId);
|
|
183
|
+
if (cs === undefined)
|
|
184
|
+
return false;
|
|
185
|
+
const col = cs.columns[rf.targetFieldIndex];
|
|
186
|
+
if (col === undefined)
|
|
187
|
+
return false;
|
|
188
|
+
const stored = col.view[row * col.layout.stride];
|
|
189
|
+
const decoded = decodeEid(stored);
|
|
190
|
+
if (decoded === null)
|
|
191
|
+
return false;
|
|
192
|
+
if (decoded !== (rf.targetEid >>> 0))
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
/** The hot loop: walk matchingArchetypes contiguous rows, poke the accessor singletons, call fn. */
|
|
198
|
+
each(fn) {
|
|
199
|
+
const binding = this.#hotBinding();
|
|
200
|
+
const hasRowFilters = this.compiled.rowFilters.length !== 0;
|
|
201
|
+
const archs = this.matchingArchetypes;
|
|
202
|
+
for (let ai = 0; ai < archs.length; ai++) {
|
|
203
|
+
const arch = archs[ai];
|
|
204
|
+
if (arch.cold) {
|
|
205
|
+
this.#eachCold(arch, binding, fn);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const count = arch.count;
|
|
209
|
+
if (count === 0)
|
|
210
|
+
continue;
|
|
211
|
+
const el = this.#elementFor(arch, binding);
|
|
212
|
+
const accessors = this.#accessorsFor(arch, binding);
|
|
213
|
+
const na = accessors.length;
|
|
214
|
+
const rows = arch.rows;
|
|
215
|
+
for (let row = 0; row < count; row++) {
|
|
216
|
+
if (hasRowFilters && !this.#passesRowFilters(arch, row))
|
|
217
|
+
continue;
|
|
218
|
+
const handle = rows[row];
|
|
219
|
+
for (let k = 0; k < na; k++) {
|
|
220
|
+
const a = accessors[k];
|
|
221
|
+
a.__idx = row;
|
|
222
|
+
a.__eid = handle;
|
|
223
|
+
}
|
|
224
|
+
el.handle = handle;
|
|
225
|
+
fn(el);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Opt-in column-cursor iteration (the SoA fast path). Instead of the per-row pooled element +
|
|
231
|
+
* accessor getters/setters, `eachChunk` hands the callback ONE reused {@link QueryChunk} per matched
|
|
232
|
+
* (non-cold) archetype, exposing the raw typed column views + a contiguous row span. The caller indexes
|
|
233
|
+
* `view[row]` directly (stride-1 scalars) — bypassing the accessor decode/encode AND the per-write
|
|
234
|
+
* change-tracking push, so it lands close to a raw SoA loop. Cold archetypes (no contiguous columns)
|
|
235
|
+
* are NOT visited by `eachChunk`; mix `each`/`eachCold` if a query can fragment. Writes through the
|
|
236
|
+
* cursor are NOT recorded in the reactivity write log: a `.changed`/observer consumer will not see them
|
|
237
|
+
* — use `each` when reactivity must observe the write.
|
|
238
|
+
*
|
|
239
|
+
* The chunk and its column lookups are reused across calls/archetypes — do NOT store the chunk or a
|
|
240
|
+
* returned view across iterations.
|
|
241
|
+
*/
|
|
242
|
+
eachChunk(fn) {
|
|
243
|
+
const chunk = this.#chunk ?? (this.#chunk = new QueryChunk());
|
|
244
|
+
const hasRowFilters = this.compiled.rowFilters.length !== 0;
|
|
245
|
+
const archs = this.matchingArchetypes;
|
|
246
|
+
for (let ai = 0; ai < archs.length; ai++) {
|
|
247
|
+
const arch = archs[ai];
|
|
248
|
+
if (arch.cold || arch.count === 0)
|
|
249
|
+
continue;
|
|
250
|
+
// Row filters select a SUBSET of rows; the chunk exposes a contiguous span, so skip those
|
|
251
|
+
// archetypes here (correctness over the fast path) — the caller falls back to `each` for them.
|
|
252
|
+
if (hasRowFilters) {
|
|
253
|
+
let allPass = true;
|
|
254
|
+
for (let row = 0; row < arch.count; row++) {
|
|
255
|
+
if (!this.#passesRowFilters(arch, row)) {
|
|
256
|
+
allPass = false;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (!allPass)
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
chunk.__bind(arch);
|
|
264
|
+
fn(chunk);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
*[Symbol.iterator]() {
|
|
268
|
+
// A simple eager collection of (archetype,row) snapshots would allocate; instead drive `each`
|
|
269
|
+
// through a buffered generator that yields the SAME pooled element per archetype. Single active
|
|
270
|
+
// iteration is the contract — do not store the element across yields.
|
|
271
|
+
const binding = this.#hotBinding();
|
|
272
|
+
for (const arch of this.matchingArchetypes) {
|
|
273
|
+
if (arch.cold) {
|
|
274
|
+
yield* this.#eachColdGen(arch, binding);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (arch.count === 0)
|
|
278
|
+
continue;
|
|
279
|
+
const el = this.#elementFor(arch, binding);
|
|
280
|
+
const accessors = this.#accessorsFor(arch, binding);
|
|
281
|
+
const na = accessors.length;
|
|
282
|
+
for (let row = 0; row < arch.count; row++) {
|
|
283
|
+
if (!this.#passesRowFilters(arch, row))
|
|
284
|
+
continue;
|
|
285
|
+
const handle = arch.rows[row];
|
|
286
|
+
for (let k = 0; k < na; k++) {
|
|
287
|
+
const a = accessors[k];
|
|
288
|
+
a.__idx = row;
|
|
289
|
+
a.__eid = handle;
|
|
290
|
+
}
|
|
291
|
+
el.handle = handle;
|
|
292
|
+
yield el;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
eachAdded(fn) {
|
|
297
|
+
const d = this.#delta;
|
|
298
|
+
if (d === null || !d.hasAdded)
|
|
299
|
+
return;
|
|
300
|
+
this.#eachScattered([...d.added], fn);
|
|
301
|
+
}
|
|
302
|
+
eachRemoved(fn) {
|
|
303
|
+
const d = this.#delta;
|
|
304
|
+
if (d === null || !d.hasRemoved)
|
|
305
|
+
return;
|
|
306
|
+
for (const [index, handle] of d.removed)
|
|
307
|
+
fn(index, handle);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
*: the Changed filter reads the reactivity WRITE LOG, not changeVersion. The write log lands
|
|
311
|
+
* at; until then there are no recorded writes, so the changed set is empty. The matching surface
|
|
312
|
+
* (binding the cursor per changed index) is in place for to fill the index source.
|
|
313
|
+
*/
|
|
314
|
+
eachChanged(fn) {
|
|
315
|
+
// Drain the write-log changed set (deduped, intersected with `current`), then bind the
|
|
316
|
+
// cursor per scattered index. The changed set spans multiple archetypes, so reuse #eachScattered.
|
|
317
|
+
if (this.#reactivity === null || !this.#changedDeclared)
|
|
318
|
+
return;
|
|
319
|
+
const indices = this.#reactivity.drainChanged(this);
|
|
320
|
+
this.#eachScattered(indices, fn);
|
|
321
|
+
}
|
|
322
|
+
// --- internals -------------------------------------------------------------
|
|
323
|
+
/**: bind the cursor per scattered index (added set spans multiple archetypes). */
|
|
324
|
+
#eachScattered(indices, fn) {
|
|
325
|
+
const binding = this.#hotBinding();
|
|
326
|
+
for (const index of indices) {
|
|
327
|
+
const loc = this.#deps.resolveLocation(index);
|
|
328
|
+
const arch = this.#byId[loc.archetypeId];
|
|
329
|
+
if (arch === undefined)
|
|
330
|
+
continue;
|
|
331
|
+
const handle = this.#deps.handleOf(index);
|
|
332
|
+
// A cold archetype carries no per-archetype columns; its accessor singletons live on the cold
|
|
333
|
+
// per-type blocks, resolved per (index, component) rather than a single hot row.
|
|
334
|
+
const el = arch.cold
|
|
335
|
+
? this.#bindColdRow(arch, binding, index, handle)
|
|
336
|
+
: this.#bindRow(arch, binding, loc.row, handle);
|
|
337
|
+
fn(el);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/** Bind a hot (archetype, value-sig) element + accessors to one row and entity, returning the element. */
|
|
341
|
+
#bindRow(arch, binding, row, handle) {
|
|
342
|
+
const el = this.#elementFor(arch, binding);
|
|
343
|
+
const accessors = this.#accessorsFor(arch, binding);
|
|
344
|
+
for (const a of accessors) {
|
|
345
|
+
a.__idx = row;
|
|
346
|
+
a.__eid = handle;
|
|
347
|
+
}
|
|
348
|
+
el.handle = handle;
|
|
349
|
+
return el;
|
|
350
|
+
}
|
|
351
|
+
/** Bind a cold row: each value-term's accessor lands on its own per-component cold-block row. */
|
|
352
|
+
#bindColdRow(arch, binding, index, handle) {
|
|
353
|
+
const el = this.#coldElementFor(arch, binding);
|
|
354
|
+
for (const slot of this.#coldSlotsFor(arch, binding)) {
|
|
355
|
+
slot.accessor.__idx = this.#deps.coldRowOf(index, slot.componentId);
|
|
356
|
+
slot.accessor.__eid = handle;
|
|
357
|
+
}
|
|
358
|
+
el.handle = handle;
|
|
359
|
+
return el;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Cold archetypes carry no contiguous columns; resolve each resident through the record.
|
|
363
|
+
* O(rows in this cold archetype) — driven by the ColdStore's per-archetype membership, NOT by a
|
|
364
|
+
* filter over the whole `current` set (which would be O(cold archetypes × |current|)).
|
|
365
|
+
*/
|
|
366
|
+
#eachCold(arch, binding, fn) {
|
|
367
|
+
for (const index of this.#deps.coldResidentsOf(arch.id)) {
|
|
368
|
+
fn(this.#bindColdRow(arch, binding, index, this.#deps.handleOf(index)));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/** Generator twin of #eachCold for the [Symbol.iterator] surface ( cold transparency). */
|
|
372
|
+
*#eachColdGen(arch, binding) {
|
|
373
|
+
for (const index of this.#deps.coldResidentsOf(arch.id)) {
|
|
374
|
+
yield this.#bindColdRow(arch, binding, index, this.#deps.handleOf(index));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
#elementFor(arch, binding) {
|
|
378
|
+
const archId = arch.id;
|
|
379
|
+
let el = binding.elements.get(archId);
|
|
380
|
+
if (el !== undefined)
|
|
381
|
+
return el;
|
|
382
|
+
el = { handle: NO_HANDLE };
|
|
383
|
+
for (const vt of binding.valueTerms) {
|
|
384
|
+
const cs = arch.columnSets.get(vt.componentId);
|
|
385
|
+
if (cs !== undefined) {
|
|
386
|
+
const accessor = cs.accessor;
|
|
387
|
+
Object.defineProperty(el, vt.key, {
|
|
388
|
+
enumerable: true,
|
|
389
|
+
configurable: true,
|
|
390
|
+
get: () => accessor,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
else if (vt.role === 'optional') {
|
|
394
|
+
Object.defineProperty(el, vt.key, {
|
|
395
|
+
enumerable: true,
|
|
396
|
+
configurable: true,
|
|
397
|
+
get: () => undefined,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
// has/without contribute no value term, hence no prop (handled at compile time).
|
|
401
|
+
}
|
|
402
|
+
binding.elements.set(archId, el);
|
|
403
|
+
return el;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* The accessor singletons whose __idx/__eid the cursor pokes for this (archetype, value-sig).
|
|
407
|
+
* Built ONCE per (archetype, value-sig) at first touch and cached on the binding, so
|
|
408
|
+
* the hot each()/iterator loop reuses it with zero per-call allocation.
|
|
409
|
+
*/
|
|
410
|
+
#accessorsFor(arch, binding) {
|
|
411
|
+
const archId = arch.id;
|
|
412
|
+
let cached = binding.accessors.get(archId);
|
|
413
|
+
if (cached !== undefined)
|
|
414
|
+
return cached;
|
|
415
|
+
const out = [];
|
|
416
|
+
for (const vt of binding.valueTerms) {
|
|
417
|
+
const cs = arch.columnSets.get(vt.componentId);
|
|
418
|
+
if (cs !== undefined)
|
|
419
|
+
out.push(cs.accessor);
|
|
420
|
+
}
|
|
421
|
+
cached = out;
|
|
422
|
+
binding.accessors.set(archId, cached);
|
|
423
|
+
return cached;
|
|
424
|
+
}
|
|
425
|
+
/** The pooled element for a COLD archetype — value props read the per-type cold-block accessors. */
|
|
426
|
+
#coldElementFor(arch, binding) {
|
|
427
|
+
const archId = arch.id;
|
|
428
|
+
let el = binding.coldElements.get(archId);
|
|
429
|
+
if (el !== undefined)
|
|
430
|
+
return el;
|
|
431
|
+
el = { handle: NO_HANDLE };
|
|
432
|
+
for (const vt of binding.valueTerms) {
|
|
433
|
+
const cs = this.#deps.coldColumnSet(vt.componentId);
|
|
434
|
+
if (cs !== undefined) {
|
|
435
|
+
const accessor = cs.accessor;
|
|
436
|
+
Object.defineProperty(el, vt.key, { enumerable: true, configurable: true, get: () => accessor });
|
|
437
|
+
}
|
|
438
|
+
else if (vt.role === 'optional') {
|
|
439
|
+
Object.defineProperty(el, vt.key, { enumerable: true, configurable: true, get: () => undefined });
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
binding.coldElements.set(archId, el);
|
|
443
|
+
return el;
|
|
444
|
+
}
|
|
445
|
+
/** The (cold accessor, componentId) slots whose __idx the cursor pokes to each entity's cold row. */
|
|
446
|
+
#coldSlotsFor(arch, binding) {
|
|
447
|
+
const archId = arch.id;
|
|
448
|
+
let cached = binding.coldSlots.get(archId);
|
|
449
|
+
if (cached !== undefined)
|
|
450
|
+
return cached;
|
|
451
|
+
const out = [];
|
|
452
|
+
for (const vt of binding.valueTerms) {
|
|
453
|
+
const cs = this.#deps.coldColumnSet(vt.componentId);
|
|
454
|
+
if (cs !== undefined) {
|
|
455
|
+
out.push({
|
|
456
|
+
accessor: cs.accessor,
|
|
457
|
+
componentId: vt.componentId,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
cached = out;
|
|
462
|
+
binding.coldSlots.set(archId, cached);
|
|
463
|
+
return cached;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
_a = LiveQuery;
|
|
467
|
+
/**
|
|
468
|
+
* The reused per-archetype cursor handed to {@link LiveQuery.eachChunk}. Exposes one matched archetype's
|
|
469
|
+
* raw SoA columns + its contiguous row span. Resolve each column ONCE before the inner row loop:
|
|
470
|
+
*
|
|
471
|
+
* ```ts
|
|
472
|
+
* q.eachChunk((c) => {
|
|
473
|
+
* const px = c.column(Position, 'x'), py = c.column(Position, 'y')
|
|
474
|
+
* const dx = c.column(Velocity, 'dx'), dy = c.column(Velocity, 'dy')
|
|
475
|
+
* for (let i = 0; i < c.count; i) { px[i] += dx[i] * dt; py[i] += dy[i] * dt }
|
|
476
|
+
* })
|
|
477
|
+
* ```
|
|
478
|
+
*
|
|
479
|
+
* `column` returns the live typed view; `stride` is the slots-per-row (>1 for vec fields, where row `r`
|
|
480
|
+
* starts at `r * stride`). The cursor (and every returned view) is reused across archetypes/calls — do NOT
|
|
481
|
+
* store either across iterations. Writes here bypass the reactivity write log (see `eachChunk`).
|
|
482
|
+
*/
|
|
483
|
+
export class QueryChunk {
|
|
484
|
+
#arch = null;
|
|
485
|
+
/** componentId → (fieldName → columnIndex within that component's ColumnSet). Built lazily, reused. */
|
|
486
|
+
#colIndex = new Map();
|
|
487
|
+
/** @internal — point the chunk at one matched archetype (the cursor loop owns this). */
|
|
488
|
+
__bind(arch) {
|
|
489
|
+
this.#arch = arch;
|
|
490
|
+
}
|
|
491
|
+
/** Rows in this chunk (the archetype's dense row count). Iterate `0..count`. */
|
|
492
|
+
get count() {
|
|
493
|
+
return this.#arch === null ? 0 : this.#arch.count;
|
|
494
|
+
}
|
|
495
|
+
/** The dense row→EntityHandle list for this chunk (row `r`'s entity is `entities[r]`). */
|
|
496
|
+
get entities() {
|
|
497
|
+
return this.#arch === null ? EMPTY_ROWS : this.#arch.rows;
|
|
498
|
+
}
|
|
499
|
+
#resolveColumnIndex(def, field) {
|
|
500
|
+
const cid = def.id;
|
|
501
|
+
let byName = this.#colIndex.get(cid);
|
|
502
|
+
if (byName === undefined) {
|
|
503
|
+
byName = new Map();
|
|
504
|
+
let colIdx = 0;
|
|
505
|
+
for (const f of def.fields) {
|
|
506
|
+
// object<T> contributes no column; skip it so column indices match the ColumnSet build order.
|
|
507
|
+
if (f.ctor !== null) {
|
|
508
|
+
byName.set(f.name, colIdx);
|
|
509
|
+
colIdx += 1;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
this.#colIndex.set(cid, byName);
|
|
513
|
+
}
|
|
514
|
+
const idx = byName.get(field);
|
|
515
|
+
if (idx === undefined) {
|
|
516
|
+
throw new Error(`QueryChunk.column: component '${def.name}' has no column-backed field '${field}'`);
|
|
517
|
+
}
|
|
518
|
+
return idx;
|
|
519
|
+
}
|
|
520
|
+
#columnOf(def, field) {
|
|
521
|
+
if (this.#arch === null)
|
|
522
|
+
throw new Error('QueryChunk: not bound');
|
|
523
|
+
const cs = this.#arch.columnSets.get(def.id);
|
|
524
|
+
if (cs === undefined) {
|
|
525
|
+
throw new Error(`QueryChunk.column: archetype lacks component '${def.name}' (not in this query?)`);
|
|
526
|
+
}
|
|
527
|
+
const col = cs.columns[this.#resolveColumnIndex(def, field)];
|
|
528
|
+
if (col === undefined)
|
|
529
|
+
throw new Error(`QueryChunk.column: missing column for '${def.name}.${field}'`);
|
|
530
|
+
return { view: col.view, stride: col.layout.stride };
|
|
531
|
+
}
|
|
532
|
+
/** The live typed column view for `def.field` in this chunk. Stride-1 scalars index by row directly. */
|
|
533
|
+
column(def, field) {
|
|
534
|
+
return this.#columnOf(def, field).view;
|
|
535
|
+
}
|
|
536
|
+
/** Slots per row for `def.field` (1 scalar, N vec): row `r` starts at `r * stride`. */
|
|
537
|
+
stride(def, field) {
|
|
538
|
+
return this.#columnOf(def, field).stride;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
const EMPTY_ROWS = new Uint32Array(0);
|
|
542
|
+
export { NO_HANDLE };
|
|
543
|
+
//# sourceMappingURL=live-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-query.js","sourceRoot":"","sources":["../../src/query/live-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Buffers, RegionKey } from '../memory/index.js';
|
|
2
|
+
export declare class SparseSetU32 {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(buffers: Buffers, denseKey: RegionKey, sparseKey: RegionKey, initialCapacity: number, maxEntities: number);
|
|
5
|
+
get size(): number;
|
|
6
|
+
/** sparse[index] points into dense; the slot is valid iff dense[pos] === index AND pos < size. */
|
|
7
|
+
has(index: number): boolean;
|
|
8
|
+
/** O(1); idempotent (has-guarded so no dup). Grows the addressable space lazily. */
|
|
9
|
+
add(index: number): void;
|
|
10
|
+
/** O(1) swap-and-pop within dense. No-op if absent. */
|
|
11
|
+
remove(index: number): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
/** Dense iteration over dense[0..size). Values are entity indices. */
|
|
14
|
+
[Symbol.iterator](): Iterator<number>;
|
|
15
|
+
/** A live view of the dense prefix [0..size) — zero-copy; callers must not mutate it. */
|
|
16
|
+
denseView(): Uint32Array;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=sparse-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparse-set.d.ts","sourceRoot":"","sources":["../../src/query/sparse-set.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAU,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAKpE,qBAAa,YAAY;;gBAUX,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAWrH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,kGAAkG;IAClG,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM3B,oFAAoF;IACpF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASxB,uDAAuD;IACvD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU3B,KAAK,IAAI,IAAI;IAIb,sEAAsE;IACrE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;IAItC,yFAAyF;IACzF,SAAS,IAAI,WAAW;CAgBzB"}
|