@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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/bitmask/bitmask.d.ts +21 -0
  4. package/dist/bitmask/bitmask.d.ts.map +1 -0
  5. package/dist/bitmask/bitmask.js +103 -0
  6. package/dist/bitmask/bitmask.js.map +1 -0
  7. package/dist/bitmask/index.d.ts +3 -0
  8. package/dist/bitmask/index.d.ts.map +1 -0
  9. package/dist/bitmask/index.js +2 -0
  10. package/dist/bitmask/index.js.map +1 -0
  11. package/dist/component/accessor.d.ts +40 -0
  12. package/dist/component/accessor.d.ts.map +1 -0
  13. package/dist/component/accessor.js +220 -0
  14. package/dist/component/accessor.js.map +1 -0
  15. package/dist/component/column-set.d.ts +20 -0
  16. package/dist/component/column-set.d.ts.map +1 -0
  17. package/dist/component/column-set.js +60 -0
  18. package/dist/component/column-set.js.map +1 -0
  19. package/dist/component/define.d.ts +23 -0
  20. package/dist/component/define.d.ts.map +1 -0
  21. package/dist/component/define.js +155 -0
  22. package/dist/component/define.js.map +1 -0
  23. package/dist/component/descriptors.d.ts +3 -0
  24. package/dist/component/descriptors.d.ts.map +1 -0
  25. package/dist/component/descriptors.js +147 -0
  26. package/dist/component/descriptors.js.map +1 -0
  27. package/dist/component/index.d.ts +10 -0
  28. package/dist/component/index.d.ts.map +1 -0
  29. package/dist/component/index.js +6 -0
  30. package/dist/component/index.js.map +1 -0
  31. package/dist/component/sidecar.d.ts +58 -0
  32. package/dist/component/sidecar.d.ts.map +1 -0
  33. package/dist/component/sidecar.js +136 -0
  34. package/dist/component/sidecar.js.map +1 -0
  35. package/dist/config.d.ts +55 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +70 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/entity/codec.d.ts +45 -0
  40. package/dist/entity/codec.d.ts.map +1 -0
  41. package/dist/entity/codec.js +53 -0
  42. package/dist/entity/codec.js.map +1 -0
  43. package/dist/entity/index-allocator.d.ts +46 -0
  44. package/dist/entity/index-allocator.d.ts.map +1 -0
  45. package/dist/entity/index-allocator.js +121 -0
  46. package/dist/entity/index-allocator.js.map +1 -0
  47. package/dist/entity/index.d.ts +13 -0
  48. package/dist/entity/index.d.ts.map +1 -0
  49. package/dist/entity/index.js +7 -0
  50. package/dist/entity/index.js.map +1 -0
  51. package/dist/entity/record.d.ts +28 -0
  52. package/dist/entity/record.d.ts.map +1 -0
  53. package/dist/entity/record.js +42 -0
  54. package/dist/entity/record.js.map +1 -0
  55. package/dist/entity/ref.d.ts +70 -0
  56. package/dist/entity/ref.d.ts.map +1 -0
  57. package/dist/entity/ref.js +104 -0
  58. package/dist/entity/ref.js.map +1 -0
  59. package/dist/entity/reservation.d.ts +12 -0
  60. package/dist/entity/reservation.d.ts.map +1 -0
  61. package/dist/entity/reservation.js +28 -0
  62. package/dist/entity/reservation.js.map +1 -0
  63. package/dist/entity/store.d.ts +60 -0
  64. package/dist/entity/store.d.ts.map +1 -0
  65. package/dist/entity/store.js +193 -0
  66. package/dist/entity/store.js.map +1 -0
  67. package/dist/env.d.ts +2 -0
  68. package/dist/env.d.ts.map +1 -0
  69. package/dist/env.js +12 -0
  70. package/dist/env.js.map +1 -0
  71. package/dist/ids.d.ts +9 -0
  72. package/dist/ids.d.ts.map +1 -0
  73. package/dist/ids.js +8 -0
  74. package/dist/ids.js.map +1 -0
  75. package/dist/index.d.ts +29 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +33 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/inspect-surface.d.ts +27 -0
  80. package/dist/inspect-surface.d.ts.map +1 -0
  81. package/dist/inspect-surface.js +14 -0
  82. package/dist/inspect-surface.js.map +1 -0
  83. package/dist/internal.d.ts +19 -0
  84. package/dist/internal.d.ts.map +1 -0
  85. package/dist/internal.js +19 -0
  86. package/dist/internal.js.map +1 -0
  87. package/dist/memory/allocU32.d.ts +25 -0
  88. package/dist/memory/allocU32.d.ts.map +1 -0
  89. package/dist/memory/allocU32.js +95 -0
  90. package/dist/memory/allocU32.js.map +1 -0
  91. package/dist/memory/buffers.d.ts +94 -0
  92. package/dist/memory/buffers.d.ts.map +1 -0
  93. package/dist/memory/buffers.js +308 -0
  94. package/dist/memory/buffers.js.map +1 -0
  95. package/dist/memory/index.d.ts +7 -0
  96. package/dist/memory/index.d.ts.map +1 -0
  97. package/dist/memory/index.js +4 -0
  98. package/dist/memory/index.js.map +1 -0
  99. package/dist/memory/layout.d.ts +37 -0
  100. package/dist/memory/layout.d.ts.map +1 -0
  101. package/dist/memory/layout.js +116 -0
  102. package/dist/memory/layout.js.map +1 -0
  103. package/dist/query/compile.d.ts +73 -0
  104. package/dist/query/compile.d.ts.map +1 -0
  105. package/dist/query/compile.js +158 -0
  106. package/dist/query/compile.js.map +1 -0
  107. package/dist/query/engine.d.ts +48 -0
  108. package/dist/query/engine.d.ts.map +1 -0
  109. package/dist/query/engine.js +230 -0
  110. package/dist/query/engine.js.map +1 -0
  111. package/dist/query/index.d.ts +8 -0
  112. package/dist/query/index.d.ts.map +1 -0
  113. package/dist/query/index.js +10 -0
  114. package/dist/query/index.js.map +1 -0
  115. package/dist/query/live-query.d.ts +122 -0
  116. package/dist/query/live-query.d.ts.map +1 -0
  117. package/dist/query/live-query.js +543 -0
  118. package/dist/query/live-query.js.map +1 -0
  119. package/dist/query/sparse-set.d.ts +18 -0
  120. package/dist/query/sparse-set.d.ts.map +1 -0
  121. package/dist/query/sparse-set.js +126 -0
  122. package/dist/query/sparse-set.js.map +1 -0
  123. package/dist/reactivity/change-version.d.ts +19 -0
  124. package/dist/reactivity/change-version.d.ts.map +1 -0
  125. package/dist/reactivity/change-version.js +76 -0
  126. package/dist/reactivity/change-version.js.map +1 -0
  127. package/dist/reactivity/index.d.ts +12 -0
  128. package/dist/reactivity/index.d.ts.map +1 -0
  129. package/dist/reactivity/index.js +12 -0
  130. package/dist/reactivity/index.js.map +1 -0
  131. package/dist/reactivity/log.d.ts +83 -0
  132. package/dist/reactivity/log.d.ts.map +1 -0
  133. package/dist/reactivity/log.js +260 -0
  134. package/dist/reactivity/log.js.map +1 -0
  135. package/dist/reactivity/observer-commands.d.ts +40 -0
  136. package/dist/reactivity/observer-commands.d.ts.map +1 -0
  137. package/dist/reactivity/observer-commands.js +111 -0
  138. package/dist/reactivity/observer-commands.js.map +1 -0
  139. package/dist/reactivity/observers.d.ts +50 -0
  140. package/dist/reactivity/observers.d.ts.map +1 -0
  141. package/dist/reactivity/observers.js +127 -0
  142. package/dist/reactivity/observers.js.map +1 -0
  143. package/dist/reactivity/reactivity.d.ts +141 -0
  144. package/dist/reactivity/reactivity.d.ts.map +1 -0
  145. package/dist/reactivity/reactivity.js +479 -0
  146. package/dist/reactivity/reactivity.js.map +1 -0
  147. package/dist/reactivity/structural-journal.d.ts +30 -0
  148. package/dist/reactivity/structural-journal.d.ts.map +1 -0
  149. package/dist/reactivity/structural-journal.js +77 -0
  150. package/dist/reactivity/structural-journal.js.map +1 -0
  151. package/dist/registry.d.ts +26 -0
  152. package/dist/registry.d.ts.map +1 -0
  153. package/dist/registry.js +58 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/serialize-surface.d.ts +170 -0
  156. package/dist/serialize-surface.d.ts.map +1 -0
  157. package/dist/serialize-surface.js +6 -0
  158. package/dist/serialize-surface.js.map +1 -0
  159. package/dist/storage/archetype.d.ts +38 -0
  160. package/dist/storage/archetype.d.ts.map +1 -0
  161. package/dist/storage/archetype.js +47 -0
  162. package/dist/storage/archetype.js.map +1 -0
  163. package/dist/storage/cold-store.d.ts +41 -0
  164. package/dist/storage/cold-store.d.ts.map +1 -0
  165. package/dist/storage/cold-store.js +100 -0
  166. package/dist/storage/cold-store.js.map +1 -0
  167. package/dist/storage/index.d.ts +10 -0
  168. package/dist/storage/index.d.ts.map +1 -0
  169. package/dist/storage/index.js +5 -0
  170. package/dist/storage/index.js.map +1 -0
  171. package/dist/storage/signature.d.ts +27 -0
  172. package/dist/storage/signature.d.ts.map +1 -0
  173. package/dist/storage/signature.js +115 -0
  174. package/dist/storage/signature.js.map +1 -0
  175. package/dist/storage/storage.d.ts +72 -0
  176. package/dist/storage/storage.d.ts.map +1 -0
  177. package/dist/storage/storage.js +192 -0
  178. package/dist/storage/storage.js.map +1 -0
  179. package/dist/storage/store.d.ts +88 -0
  180. package/dist/storage/store.d.ts.map +1 -0
  181. package/dist/storage/store.js +473 -0
  182. package/dist/storage/store.js.map +1 -0
  183. package/dist/util/stable-index.d.ts +29 -0
  184. package/dist/util/stable-index.d.ts.map +1 -0
  185. package/dist/util/stable-index.js +51 -0
  186. package/dist/util/stable-index.js.map +1 -0
  187. package/dist/world.d.ts +262 -0
  188. package/dist/world.d.ts.map +1 -0
  189. package/dist/world.js +831 -0
  190. package/dist/world.js.map +1 -0
  191. package/package.json +52 -0
@@ -0,0 +1,230 @@
1
+ // The query engine: the canonical-hash dedup cache (Map<hash, LiveQuery>),
2
+ // the per-archetype matching (signatureMatches over matchingArchetypes — O(A), NOT per-entity), the
3
+ // archetypeCreated incremental upkeep, the reverse queriesReferencing index, and the single-entity
4
+ // incremental matcher (matchEntity over entityShapeWords) used ONLY to re-test one migrated entity.
5
+ //
6
+ // Wired by the world: it subscribes to storage.onArchetypeCreated and supplies storage's
7
+ // maintainEntity / dropEntity hooks. All matching/maintenance is serial / main-thread.
8
+ import { sigHas, signatureMatches } from '../storage/index.js';
9
+ import { compileQuery } from './compile.js';
10
+ import { LiveQuery } from './live-query.js';
11
+ import { SparseSetU32 } from './sparse-set.js';
12
+ export class QueryEngine {
13
+ #deps;
14
+ #byHash = new Map();
15
+ /** componentId → the live queries that reference it (reverse maintenance index). */
16
+ #referencing = new Map();
17
+ #reactivity = null;
18
+ #seq = 0;
19
+ constructor(deps) {
20
+ this.#deps = deps;
21
+ deps.onArchetypeCreated((arch) => this.#onArchetypeCreated(arch));
22
+ }
23
+ /** Late-bind the reactivity write-log hooks so the Changed flavor works (world wiring). */
24
+ setReactivity(hooks) {
25
+ this.#reactivity = hooks;
26
+ for (const lq of this.#byHash.values())
27
+ lq.__setReactivity(hooks);
28
+ }
29
+ /**: compile, dedup by canonical hash, seed on a miss. */
30
+ query(terms) {
31
+ const compiled = compileQuery(terms, this.#deps.compileContext);
32
+ const existing = this.#byHash.get(compiled.hash);
33
+ if (existing !== undefined) {
34
+ existing.ensureValueSignature(compiled);
35
+ return existing;
36
+ }
37
+ const lq = this.#createLiveQuery(compiled, terms);
38
+ this.#byHash.set(compiled.hash, lq);
39
+ return lq;
40
+ }
41
+ /** Exposed for the world facade / tests: iterate every live query (e.g. for frameReset). */
42
+ get liveQueries() {
43
+ return this.#byHash.values();
44
+ }
45
+ // ---: allocate the result container, seed all existing archetypes ----------
46
+ #createLiveQuery(compiled, terms) {
47
+ const id = this.#seq++;
48
+ const denseKey = `query.${id}.dense`;
49
+ const sparseKey = `query.${id}.sparse`;
50
+ const current = new SparseSetU32(this.#deps.buffers, denseKey, sparseKey, 64, this.#deps.maxEntities);
51
+ const lq = new LiveQuery(compiled, terms, current, this.#deps.byId, this.#deps);
52
+ lq.ensureValueSignature(compiled);
53
+ if (this.#reactivity !== null)
54
+ lq.__setReactivity(this.#reactivity);
55
+ if (!compiled.unsatisfiable) {
56
+ for (const arch of this.#deps.byId) {
57
+ if (this.#archetypeMatches(arch, compiled)) {
58
+ lq.addMatchingArchetype(arch);
59
+ this.#seedCurrentFromArchetype(lq, arch);
60
+ }
61
+ }
62
+ }
63
+ // Register in the reverse maintenance index for incremental upkeep.
64
+ for (const cid of compiled.referencedIds) {
65
+ let set = this.#referencing.get(cid);
66
+ if (set === undefined) {
67
+ set = new Set();
68
+ this.#referencing.set(cid, set);
69
+ }
70
+ set.add(lq);
71
+ }
72
+ lq.lastMatchTick = 0;
73
+ return lq;
74
+ }
75
+ // --- (one AND per signature word) ------------------------------
76
+ #archetypeMatches(arch, q) {
77
+ if (q.unsatisfiable)
78
+ return false;
79
+ if (!signatureMatches(arch.sigWords, q.withWords, q.notWords, []))
80
+ return false;
81
+ for (const r of q.residualWith) {
82
+ const present = sigHas(arch.signature, r.componentId);
83
+ if (r.negate ? present : !present)
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ /**
89
+ * (a) row filter for the single-entity matcher: an exclusive specific-target pair
90
+ * matches the archetype by presence, then this checks the entity's own eid target column value so
91
+ * `current` stays precise (count/has agree with the iteration filter in LiveQuery).
92
+ */
93
+ #passesRowFilters(index, q) {
94
+ if (q.rowFilters.length === 0)
95
+ return true;
96
+ const loc = this.#deps.resolveLocation(index);
97
+ const arch = this.#deps.byId[loc.archetypeId];
98
+ if (arch === undefined || arch.cold)
99
+ return q.rowFilters.length === 0;
100
+ for (const rf of q.rowFilters) {
101
+ const cs = arch.columnSets.get(rf.presenceId);
102
+ if (cs === undefined)
103
+ return false;
104
+ const col = cs.columns[rf.targetFieldIndex];
105
+ if (col === undefined)
106
+ return false;
107
+ const stored = col.view[loc.row * col.layout.stride];
108
+ if (stored === -1 || (stored >>> 0) !== (rf.targetEid >>> 0))
109
+ return false;
110
+ }
111
+ return true;
112
+ }
113
+ /**: add every live row's entity index to `current`. New archetypes start empty. */
114
+ #seedCurrentFromArchetype(lq, arch) {
115
+ if (arch.cold) {
116
+ // Cold rows are index-keyed in the overflow store; seed from the cold archetype's residents so
117
+ // a query created AFTER cold entities exist sees them ( cold transparency), matching the
118
+ // per-entity maintenance path that adds residents as they migrate in.
119
+ for (const index of this.#deps.coldResidentsOf(arch.id))
120
+ lq.addEntity(index);
121
+ return;
122
+ }
123
+ const count = arch.count;
124
+ const filters = lq.compiled.rowFilters;
125
+ for (let row = 0; row < count; row++) {
126
+ const handle = arch.rows[row];
127
+ const index = this.#handleIndex(handle);
128
+ if (filters.length > 0 && !this.#rowPasses(arch, row, lq.compiled))
129
+ continue;
130
+ lq.addEntity(index);
131
+ }
132
+ }
133
+ /** Row-filter test against a known (archetype, row) for seeding ((a)). */
134
+ #rowPasses(arch, row, q) {
135
+ for (const rf of q.rowFilters) {
136
+ const cs = arch.columnSets.get(rf.presenceId);
137
+ if (cs === undefined)
138
+ return false;
139
+ const col = cs.columns[rf.targetFieldIndex];
140
+ if (col === undefined)
141
+ return false;
142
+ const stored = col.view[row * col.layout.stride];
143
+ if (stored === -1 || (stored >>> 0) !== (rf.targetEid >>> 0))
144
+ return false;
145
+ }
146
+ return true;
147
+ }
148
+ #handleIndex(handle) {
149
+ // The dense rows store full handles; the entity index is the low handle bits. The engine resolves
150
+ // it via the same bitmask stride the rest of the world uses — but here we only need the index, and
151
+ // the record's resolveLocation already addresses by index, so derive it from the handle directly.
152
+ return this.#deps.indexOfHandle(handle);
153
+ }
154
+ // ---
155
+ #onArchetypeCreated(arch) {
156
+ for (const lq of this.#byHash.values()) {
157
+ if (this.#archetypeMatches(arch, lq.compiled)) {
158
+ lq.addMatchingArchetype(arch);
159
+ // A brand-new archetype starts with count 0 (entities migrate in afterward), so nothing to
160
+ // seed here; the per-entity migration path populates `current` as entities enter. A
161
+ // non-empty new archetype only arises via warm promotion, which re-seeds separately.
162
+ this.#seedCurrentFromArchetype(lq, arch);
163
+ }
164
+ }
165
+ }
166
+ // --- (the ONLY per-entity AND) -------------------------
167
+ /**: re-test ONE migrated entity against only the queries referencing the changed component. */
168
+ maintainEntity(index, componentId) {
169
+ const set = this.#referencing.get(componentId);
170
+ if (set === undefined)
171
+ return;
172
+ for (const lq of set) {
173
+ const wasMatch = lq.current.has(index);
174
+ const isMatch = this.#matchesEntityNow(lq, index);
175
+ if (isMatch && !wasMatch)
176
+ lq.addEntity(index);
177
+ else if (!isMatch && wasMatch)
178
+ lq.removeEntity(index);
179
+ }
180
+ }
181
+ /**
182
+ *: a freshly spawned entity lands in the EMPTY archetype. It carries no component, so
183
+ * the per-component `maintainEntity` path never fires for it — yet a constraint-less query (empty
184
+ * withWords/notWords/residualWith) DOES match the empty signature and the seed already
185
+ * includes such entities. To keep the incremental path symmetric with the seed (so a query created
186
+ * BEFORE a plain spawn agrees with one created after), re-test the new index against every query
187
+ * that matches the empty archetype and add it.
188
+ */
189
+ onEntitySpawned(index, emptyArchetype) {
190
+ for (const lq of this.#byHash.values()) {
191
+ if (this.#archetypeMatches(emptyArchetype, lq.compiled))
192
+ lq.addEntity(index);
193
+ }
194
+ }
195
+ /**: evict a despawned entity from EVERY live query (constraint-less queries included). */
196
+ dropEntity(index) {
197
+ for (const lq of this.#byHash.values())
198
+ lq.removeEntity(index);
199
+ }
200
+ /**: AND the entity's shape words against the query masks. */
201
+ #matchesEntityNow(lq, index) {
202
+ const q = lq.compiled;
203
+ if (q.unsatisfiable)
204
+ return false;
205
+ const shape = this.#deps.bitmask.entityShapeWords(index);
206
+ for (const t of q.notWords)
207
+ if ((shape[t.wordIndex] & t.mask) !== 0)
208
+ return false;
209
+ for (const t of q.withWords)
210
+ if ((shape[t.wordIndex] & t.mask) !== t.mask)
211
+ return false;
212
+ if (q.residualWith.length > 0) {
213
+ const sig = this.#deps.signatureOf(index);
214
+ for (const r of q.residualWith) {
215
+ const present = sigHas(sig, r.componentId);
216
+ if (r.negate ? present : !present)
217
+ return false;
218
+ }
219
+ }
220
+ if (!this.#passesRowFilters(index, q))
221
+ return false;
222
+ return true;
223
+ }
224
+ /** Reset every live query's per-frame transient flavor lists (FRAME_RESET). */
225
+ frameReset() {
226
+ for (const lq of this.#byHash.values())
227
+ lq.frameReset();
228
+ }
229
+ }
230
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/query/engine.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,oGAAoG;AACpG,mGAAmG;AACnG,oGAAoG;AACpG,EAAE;AACF,yFAAyF;AACzF,uFAAuF;AAIvF,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAkB9C,MAAM,OAAO,WAAW;IACb,KAAK,CAAiB;IACtB,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC/C,oFAAoF;IAC3E,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAA;IACzD,WAAW,GAAgC,IAAI,CAAA;IAC/C,IAAI,GAAG,CAAC,CAAA;IAER,YAAY,IAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,2FAA2F;IAC3F,aAAa,CAAC,KAA2B;QACvC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IACnE,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,KAA2B;QAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YACvC,OAAO,QAAQ,CAAA;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACnC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,4FAA4F;IAC5F,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;IAC9B,CAAC;IAED,8EAA8E;IAE9E,gBAAgB,CAAC,QAAuB,EAAE,KAA2B;QACnE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACtB,MAAM,QAAQ,GAAG,SAAS,EAAE,QAAqB,CAAA;QACjD,MAAM,SAAS,GAAG,SAAS,EAAE,SAAsB,CAAA;QACnD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACrG,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/E,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QACjC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;YAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAEnE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC3C,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;oBAC7B,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QACD,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YACzC,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAa,CAAC,CAAA;YAC9C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;gBACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAa,EAAE,GAAG,CAAC,CAAA;YAC3C,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACb,CAAC;QACD,EAAE,CAAC,aAAa,GAAG,CAAC,CAAA;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,kEAAkE;IAElE,iBAAiB,CAAC,IAAe,EAAE,CAAgB;QACjD,IAAI,CAAC,CAAC,aAAa;YAAE,OAAO,KAAK,CAAA;QACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAAE,OAAO,KAAK,CAAA;QAC/E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;YACrD,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;QACjD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,KAAa,EAAE,CAAgB;QAC/C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAA;QACrE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;YAC7C,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAA;YAC3C,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YACnC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAW,CAAA;YAC9D,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;QAC5E,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mFAAmF;IACnF,yBAAyB,CAAC,EAAa,EAAE,IAAe;QACtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,+FAA+F;YAC/F,yFAAyF;YACzF,sEAAsE;YACtE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAY,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACtF,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAA;QACtC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,CAAA;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC;gBAAE,SAAQ;YAC5E,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,UAAU,CAAC,IAAe,EAAE,GAAW,EAAE,CAAgB;QACvD,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;YAC7C,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAA;YAC3C,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YACnC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAW,CAAA;YAC1D,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;QAC5E,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,kGAAkG;QAClG,mGAAmG;QACnG,kGAAkG;QAClG,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,MAAM;IAEN,mBAAmB,CAAC,IAAe;QACjC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;gBAC7B,2FAA2F;gBAC3F,oFAAoF;gBACpF,qFAAqF;gBACrF,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,0DAA0D;IAE1D,+FAA+F;IAC/F,cAAc,CAAC,KAAa,EAAE,WAAwB;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAqB,CAAC,CAAA;QACxD,IAAI,GAAG,KAAK,SAAS;YAAE,OAAM;QAC7B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YACjD,IAAI,OAAO,IAAI,CAAC,QAAQ;gBAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;iBACxC,IAAI,CAAC,OAAO,IAAI,QAAQ;gBAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,KAAa,EAAE,cAAyB;QACtD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,CAAC,QAAQ,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,UAAU,CAAC,KAAa;QACtB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC;IAED,6DAA6D;IAC7D,iBAAiB,CAAC,EAAa,EAAE,KAAa;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAA;QACrB,IAAI,CAAC,CAAC,aAAa;YAAE,OAAO,KAAK,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACxD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,IAAI,CAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;QAC7F,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;YAAE,IAAI,CAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAA;QACnG,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACzC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;gBAC1C,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;oBAAE,OAAO,KAAK,CAAA;YACjD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,+EAA+E;IAC/E,UAAU;QACR,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,EAAE,CAAC,UAAU,EAAE,CAAA;IACzD,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export { QueryEngine } from './engine.js';
2
+ export type { QueryEngineDeps } from './engine.js';
3
+ export { LiveQuery } from './live-query.js';
4
+ export type { LiveQueryDeps, PooledElement, ReactivityQueryHooks } from './live-query.js';
5
+ export { SparseSetU32 } from './sparse-set.js';
6
+ export { compileQuery } from './compile.js';
7
+ export type { CompiledQuery, CompiledValueTerm, CompileContext, ResidualTerm, ResolvedPair, RowFilterTerm, ValueRole, Word, } from './compile.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,IAAI,GACL,MAAM,cAAc,CAAA"}
@@ -0,0 +1,10 @@
1
+ // @ecsia/core query subsystem. The query DSL runtime: compilation + canonical-hash
2
+ // dedup cache (compile.ts), the SAB-capable sparse-set result container (sparse-set.ts), the
3
+ // LiveQuery with the matchingArchetypes pointer cache and the .each iteration (live-query.ts), and
4
+ // the QueryEngine that owns matching, the archetypeCreated hook, and single-entity maintenance
5
+ // (engine.ts). world.query(...) delegates here; the query DSL TYPES live in @ecsia/schema.
6
+ export { QueryEngine } from './engine.js';
7
+ export { LiveQuery } from './live-query.js';
8
+ export { SparseSetU32 } from './sparse-set.js';
9
+ export { compileQuery } from './compile.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,6FAA6F;AAC7F,mGAAmG;AACnG,+FAA+F;AAC/F,2FAA2F;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,122 @@
1
+ import type { ArchetypeId, ComponentDef, ComponentId, EntityHandle, Schema } from '@ecsia/schema';
2
+ import type { ColumnSet } from '../component/index.js';
3
+ import type { Archetype } from '../storage/index.js';
4
+ import type { TypedArray } from '../memory/index.js';
5
+ import type { CompiledQuery } from './compile.js';
6
+ import type { SparseSetU32 } from './sparse-set.js';
7
+ declare const NO_HANDLE: EntityHandle;
8
+ /** The pooled element handed to each callback: value props (per value term) + the entity handle. */
9
+ type PooledElement = Record<string, unknown> & {
10
+ handle: EntityHandle;
11
+ };
12
+ /** The reactivity write-log hooks the Changed flavor drives. */
13
+ export interface ReactivityQueryHooks {
14
+ /**: allocate this query's changed-flavor LogPointer + dedup bitset (idempotent). */
15
+ attachChangedFlavor(q: LiveQuery, componentIds: Iterable<number>): void;
16
+ /**: drain this frame's changed entity indices (deduped, intersected with `current`). */
17
+ drainChanged(q: LiveQuery): Uint32Array;
18
+ }
19
+ export interface LiveQueryDeps {
20
+ /** index → its (archetypeId, row) — the entity record. */
21
+ resolveLocation(index: number): {
22
+ archetypeId: number;
23
+ row: number;
24
+ };
25
+ /** index → its full EntityHandle (generation from the entity layer). */
26
+ handleOf(index: number): EntityHandle;
27
+ /**
28
+ * The entity indices currently resident in cold archetype `archetypeId`. Backed by the
29
+ * ColdStore's per-archetype membership so cold iteration is O(rows in that archetype), NOT
30
+ * O(|current|) per cold archetype.
31
+ */
32
+ coldResidentsOf(archetypeId: number): Iterable<number>;
33
+ /** The cold per-TYPE ColumnSet for `componentId` (cold blocks are keyed by component, not archetype). */
34
+ coldColumnSet(componentId: ComponentId): ColumnSet | undefined;
35
+ /** The cold-block row holding `componentId`'s fields for entity `index`, or -1 if absent. */
36
+ coldRowOf(index: number, componentId: ComponentId): number;
37
+ }
38
+ export declare class LiveQuery {
39
+ #private;
40
+ readonly compiled: CompiledQuery;
41
+ readonly terms: readonly unknown[];
42
+ readonly matchingArchetypes: Archetype[];
43
+ readonly current: SparseSetU32;
44
+ lastMatchTick: number;
45
+ constructor(compiled: CompiledQuery, terms: readonly unknown[], current: SparseSetU32, byId: Archetype[], deps: LiveQueryDeps);
46
+ get count(): number;
47
+ /** Chainable flavor declarations. Allocate nothing for undeclared flavors. */
48
+ added(): this;
49
+ removed(): this;
50
+ /** Install the reactivity write-log hooks (world wiring); enables the Changed flavor. */
51
+ __setReactivity(hooks: ReactivityQueryHooks): void;
52
+ changed(...components: ReadonlyArray<unknown>): this;
53
+ /** Reset per-frame transient flavor lists (FRAME_RESET). */
54
+ frameReset(): void;
55
+ /** The value-role signature: the P/W-tagged value subset, read-vs-write distinguished. */
56
+ static valueSignature(compiled: CompiledQuery): string;
57
+ ensureValueSignature(compiled: CompiledQuery): void;
58
+ /** Append a newly-created (or seeded) archetype to the pointer cache. */
59
+ addMatchingArchetype(arch: Archetype): void;
60
+ /**: add an entity index to `current`, recording a NET `added` delta where declared. */
61
+ addEntity(index: number): void;
62
+ /**: remove an entity index from `current`, recording a NET `removed` delta where declared. */
63
+ removeEntity(index: number): void;
64
+ /** The hot loop: walk matchingArchetypes contiguous rows, poke the accessor singletons, call fn. */
65
+ each(fn: (e: PooledElement) => void): void;
66
+ /**
67
+ * Opt-in column-cursor iteration (the SoA fast path). Instead of the per-row pooled element +
68
+ * accessor getters/setters, `eachChunk` hands the callback ONE reused {@link QueryChunk} per matched
69
+ * (non-cold) archetype, exposing the raw typed column views + a contiguous row span. The caller indexes
70
+ * `view[row]` directly (stride-1 scalars) — bypassing the accessor decode/encode AND the per-write
71
+ * change-tracking push, so it lands close to a raw SoA loop. Cold archetypes (no contiguous columns)
72
+ * are NOT visited by `eachChunk`; mix `each`/`eachCold` if a query can fragment. Writes through the
73
+ * cursor are NOT recorded in the reactivity write log: a `.changed`/observer consumer will not see them
74
+ * — use `each` when reactivity must observe the write.
75
+ *
76
+ * The chunk and its column lookups are reused across calls/archetypes — do NOT store the chunk or a
77
+ * returned view across iterations.
78
+ */
79
+ eachChunk(fn: (chunk: QueryChunk) => void): void;
80
+ [Symbol.iterator](): Iterator<PooledElement>;
81
+ eachAdded(fn: (e: PooledElement) => void): void;
82
+ eachRemoved(fn: (index: number, handle: EntityHandle) => void): void;
83
+ /**
84
+ *: the Changed filter reads the reactivity WRITE LOG, not changeVersion. The write log lands
85
+ * at; until then there are no recorded writes, so the changed set is empty. The matching surface
86
+ * (binding the cursor per changed index) is in place for to fill the index source.
87
+ */
88
+ eachChanged(fn: (e: PooledElement) => void): void;
89
+ }
90
+ /**
91
+ * The reused per-archetype cursor handed to {@link LiveQuery.eachChunk}. Exposes one matched archetype's
92
+ * raw SoA columns + its contiguous row span. Resolve each column ONCE before the inner row loop:
93
+ *
94
+ * ```ts
95
+ * q.eachChunk((c) => {
96
+ * const px = c.column(Position, 'x'), py = c.column(Position, 'y')
97
+ * const dx = c.column(Velocity, 'dx'), dy = c.column(Velocity, 'dy')
98
+ * for (let i = 0; i < c.count; i) { px[i] += dx[i] * dt; py[i] += dy[i] * dt }
99
+ * })
100
+ * ```
101
+ *
102
+ * `column` returns the live typed view; `stride` is the slots-per-row (>1 for vec fields, where row `r`
103
+ * starts at `r * stride`). The cursor (and every returned view) is reused across archetypes/calls — do NOT
104
+ * store either across iterations. Writes here bypass the reactivity write log (see `eachChunk`).
105
+ */
106
+ export declare class QueryChunk {
107
+ #private;
108
+ /** @internal — point the chunk at one matched archetype (the cursor loop owns this). */
109
+ __bind(arch: Archetype): void;
110
+ /** Rows in this chunk (the archetype's dense row count). Iterate `0..count`. */
111
+ get count(): number;
112
+ /** The dense row→EntityHandle list for this chunk (row `r`'s entity is `entities[r]`). */
113
+ get entities(): Uint32Array;
114
+ /** The live typed column view for `def.field` in this chunk. Stride-1 scalars index by row directly. */
115
+ column<S extends Schema>(def: ComponentDef<S>, field: string): TypedArray;
116
+ /** Slots per row for `def.field` (1 scalar, N vec): row `r` starts at `r * stride`. */
117
+ stride<S extends Schema>(def: ComponentDef<S>, field: string): number;
118
+ }
119
+ export type { PooledElement };
120
+ export { NO_HANDLE };
121
+ export type { ArchetypeId, ComponentId, Schema };
122
+ //# sourceMappingURL=live-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-query.d.ts","sourceRoot":"","sources":["../../src/query/live-query.ts"],"names":[],"mappings":"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"}