@vworlds/vecs 1.0.20 → 1.0.22

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 (155) hide show
  1. package/README.md +84 -99
  2. package/dist/component.d.ts +5 -2
  3. package/dist/component.js +4 -57
  4. package/dist/component.js.map +1 -1
  5. package/dist/component_meta.d.ts +15 -8
  6. package/dist/component_meta.js +6 -4
  7. package/dist/component_meta.js.map +1 -1
  8. package/dist/dsl.d.ts +56 -11
  9. package/dist/dsl.js +55 -38
  10. package/dist/dsl.js.map +1 -1
  11. package/dist/entity/entity.base.d.ts +4 -3
  12. package/dist/entity/entity.base.js +4 -4
  13. package/dist/entity/entity.base.js.map +1 -1
  14. package/dist/entity/entity.components.d.ts +16 -7
  15. package/dist/entity/entity.components.js +48 -23
  16. package/dist/entity/entity.components.js.map +1 -1
  17. package/dist/entity/entity.d.ts +5 -1
  18. package/dist/entity/entity.js +5 -0
  19. package/dist/entity/entity.js.map +1 -1
  20. package/dist/entity/entity.lifecycle.js +25 -25
  21. package/dist/entity/entity.lifecycle.js.map +1 -1
  22. package/dist/entity/entity.queries.js +0 -6
  23. package/dist/entity/entity.queries.js.map +1 -1
  24. package/dist/entity/entity.relationships.d.ts +1 -1
  25. package/dist/entity/entity.relationships.js +7 -5
  26. package/dist/entity/entity.relationships.js.map +1 -1
  27. package/dist/entity/index.d.ts +1 -1
  28. package/dist/entity/index.js.map +1 -1
  29. package/dist/filter.d.ts +6 -6
  30. package/dist/filter.js +2 -1
  31. package/dist/filter.js.map +1 -1
  32. package/dist/index.d.ts +10 -6
  33. package/dist/index.js +6 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/inject.d.ts +18 -17
  36. package/dist/inject.js +34 -34
  37. package/dist/inject.js.map +1 -1
  38. package/dist/module.d.ts +4 -4
  39. package/dist/module.js +0 -3
  40. package/dist/module.js.map +1 -1
  41. package/dist/modules/pipeline.d.ts +20 -0
  42. package/dist/modules/pipeline.js +57 -0
  43. package/dist/modules/pipeline.js.map +1 -0
  44. package/dist/modules/relationship_types.d.ts +37 -0
  45. package/dist/modules/relationship_types.js +39 -0
  46. package/dist/modules/relationship_types.js.map +1 -0
  47. package/dist/modules/relationships.d.ts +24 -0
  48. package/dist/modules/relationships.js +82 -0
  49. package/dist/modules/relationships.js.map +1 -0
  50. package/dist/modules/singleton.js +1 -2
  51. package/dist/modules/singleton.js.map +1 -1
  52. package/dist/package.json +2 -2
  53. package/dist/query/callbacks.d.ts +17 -0
  54. package/dist/query/callbacks.js +113 -0
  55. package/dist/query/callbacks.js.map +1 -0
  56. package/dist/query/constants.d.ts +1 -0
  57. package/dist/query/constants.js +2 -0
  58. package/dist/query/constants.js.map +1 -0
  59. package/dist/query/{query.03.tracking.d.ts → group.d.ts} +11 -9
  60. package/dist/query/group.js +31 -0
  61. package/dist/query/group.js.map +1 -0
  62. package/dist/query/grouped_query.d.ts +26 -0
  63. package/dist/query/grouped_query.js +121 -0
  64. package/dist/query/grouped_query.js.map +1 -0
  65. package/dist/query/grouped_query_registry.d.ts +4 -0
  66. package/dist/query/grouped_query_registry.js +11 -0
  67. package/dist/query/grouped_query_registry.js.map +1 -0
  68. package/dist/query/grouping.d.ts +24 -0
  69. package/dist/query/{query.07.groups.js → grouping.js} +29 -60
  70. package/dist/query/grouping.js.map +1 -0
  71. package/dist/query/index.d.ts +6 -6
  72. package/dist/query/index.js +6 -4
  73. package/dist/query/index.js.map +1 -1
  74. package/dist/query/query.d.ts +58 -28
  75. package/dist/query/query.js +334 -88
  76. package/dist/query/query.js.map +1 -1
  77. package/dist/system.d.ts +24 -54
  78. package/dist/system.js +47 -81
  79. package/dist/system.js.map +1 -1
  80. package/dist/terms/all_term.d.ts +2 -6
  81. package/dist/terms/all_term.js +2 -7
  82. package/dist/terms/all_term.js.map +1 -1
  83. package/dist/terms/any_term.d.ts +2 -6
  84. package/dist/terms/any_term.js +2 -7
  85. package/dist/terms/any_term.js.map +1 -1
  86. package/dist/terms/build.d.ts +9 -6
  87. package/dist/terms/build.js +17 -14
  88. package/dist/terms/build.js.map +1 -1
  89. package/dist/terms/component_term.d.ts +3 -3
  90. package/dist/terms/component_term.js.map +1 -1
  91. package/dist/terms/composite_build.d.ts +32 -0
  92. package/dist/terms/composite_build.js +28 -0
  93. package/dist/terms/composite_build.js.map +1 -0
  94. package/dist/terms/only_term.d.ts +3 -3
  95. package/dist/terms/only_term.js.map +1 -1
  96. package/dist/terms/predicate_term.d.ts +3 -3
  97. package/dist/terms/predicate_term.js +3 -3
  98. package/dist/terms/predicate_term.js.map +1 -1
  99. package/dist/terms/target_term.d.ts +3 -2
  100. package/dist/terms/target_term.js +11 -17
  101. package/dist/terms/target_term.js.map +1 -1
  102. package/dist/util/dense_set.js +1 -1
  103. package/dist/util/id_pool.d.ts +2 -0
  104. package/dist/util/id_pool.js +10 -0
  105. package/dist/util/id_pool.js.map +1 -1
  106. package/dist/util/ordered_set.js +15 -10
  107. package/dist/util/ordered_set.js.map +1 -1
  108. package/dist/world/world.components.d.ts +5 -9
  109. package/dist/world/world.components.js +16 -28
  110. package/dist/world/world.components.js.map +1 -1
  111. package/dist/world/world.d.ts +3 -6
  112. package/dist/world/world.entities.d.ts +2 -2
  113. package/dist/world/world.entities.js.map +1 -1
  114. package/dist/world/world.js +10 -10
  115. package/dist/world/world.js.map +1 -1
  116. package/dist/world/world.modules.d.ts +4 -7
  117. package/dist/world/world.modules.js +13 -10
  118. package/dist/world/world.modules.js.map +1 -1
  119. package/dist/world/world.pipeline.d.ts +5 -8
  120. package/dist/world/world.pipeline.js +24 -53
  121. package/dist/world/world.pipeline.js.map +1 -1
  122. package/dist/world/world.pools.d.ts +2 -1
  123. package/dist/world/world.pools.js.map +1 -1
  124. package/dist/world/world.queries.d.ts +3 -5
  125. package/dist/world/world.queries.js +11 -8
  126. package/dist/world/world.queries.js.map +1 -1
  127. package/package.json +2 -2
  128. package/dist/phase.d.ts +0 -29
  129. package/dist/phase.js +0 -24
  130. package/dist/phase.js.map +0 -1
  131. package/dist/query/query.00.base.d.ts +0 -23
  132. package/dist/query/query.00.base.js +0 -77
  133. package/dist/query/query.00.base.js.map +0 -1
  134. package/dist/query/query.01.reactive.d.ts +0 -7
  135. package/dist/query/query.01.reactive.js +0 -58
  136. package/dist/query/query.01.reactive.js.map +0 -1
  137. package/dist/query/query.02.lifecycle.d.ts +0 -6
  138. package/dist/query/query.02.lifecycle.js +0 -63
  139. package/dist/query/query.02.lifecycle.js.map +0 -1
  140. package/dist/query/query.03.tracking.js +0 -31
  141. package/dist/query/query.03.tracking.js.map +0 -1
  142. package/dist/query/query.04.callbacks.d.ts +0 -14
  143. package/dist/query/query.04.callbacks.js +0 -65
  144. package/dist/query/query.04.callbacks.js.map +0 -1
  145. package/dist/query/query.05.updates.d.ts +0 -14
  146. package/dist/query/query.05.updates.js +0 -81
  147. package/dist/query/query.05.updates.js.map +0 -1
  148. package/dist/query/query.06.predicate.d.ts +0 -13
  149. package/dist/query/query.06.predicate.js +0 -40
  150. package/dist/query/query.06.predicate.js.map +0 -1
  151. package/dist/query/query.07.groups.d.ts +0 -41
  152. package/dist/query/query.07.groups.js.map +0 -1
  153. package/dist/relationship.d.ts +0 -19
  154. package/dist/relationship.js +0 -18
  155. package/dist/relationship.js.map +0 -1
@@ -1,7 +1,10 @@
1
- import { type ComponentType } from "../component.js";
1
+ import { type ComponentRef, type ComponentType } from "../component.js";
2
+ import { type ExtractSpecsRequired, type QueryDSL, type QuerySpec } from "../dsl.js";
3
+ import { Entity } from "../entity/index.js";
4
+ import { Iter, type FanInjectTuple, type InjectTuple, type MaybeResolvedInjectTuple, type RequiredResolvedInjectTuple } from "../inject.js";
5
+ import { TermConsumer, TermEventKind, type Term } from "../terms/term.js";
2
6
  import { type World } from "../world/index.js";
3
- import { Group } from "./query.07.groups.js";
4
- import { Groups } from "./query.07.groups.js";
7
+ import { type GroupedQuery } from "./grouped_query.js";
5
8
  /**
6
9
  * A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
7
10
  * predicate.
@@ -21,33 +24,60 @@ import { Groups } from "./query.07.groups.js";
21
24
  * you want a reactive entity set without pipeline integration.
22
25
  *
23
26
  * @typeParam R - Component classes guaranteed present on every matched entity
24
- * (declared via {@link requires} or the `_guaranteed` hint of {@link query}).
25
- * Components in `R` appear as non-nullable in {@link sort}, {@link forEach},
27
+ * (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
28
+ * Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
26
29
  * and {@link update} callback tuples.
27
30
  */
28
- export declare class Query<R extends ComponentType[] = []> extends Groups<R> {
31
+ export declare class Query<R extends ComponentType[] = []> implements TermConsumer {
32
+ /** True when membership or watched component data changed since the last reset. */
33
+ changed: boolean;
34
+ /** Entity that stores this query as a component and carries query traits. */
35
+ readonly entity: Entity;
36
+ /** Materialized root term that owns membership for this query. */
37
+ rootTerm: Term | undefined;
29
38
  constructor(name: string, world: World, track?: boolean);
30
- }
31
- /**
32
- * A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
33
- * typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
34
- * the query's usual reactive membership.
35
- *
36
- * `GroupedQuery` lives in the query module alongside `Query`. Instances are
37
- * created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
38
- *
39
- * @typeParam K - The grouping key type produced by the key function (or the
40
- * relationship target entity, for the relationship form).
41
- * @typeParam R - Component classes guaranteed present on every matched entity.
42
- */
43
- export declare class GroupedQuery<K = unknown, R extends ComponentType[] = []> extends Query<R> {
44
- private _grouping;
45
- group(key: K): Group<K, R> | undefined;
46
- groups(): IterableIterator<Group<K, R>>;
47
- groupKeys(): IterableIterator<K>;
48
- get groupCount(): number;
49
- onGroupEnter(callback: (group: Group<K, R>) => void): this;
50
- onGroupExit(callback: (key: K, group: Group<K, R>) => void): this;
51
- private _composeGroupMembership;
39
+ /** `true` once this query has been registered with its world. */
40
+ get built(): boolean;
41
+ /** Unique display name; forwards to the backing entity identity. */
42
+ get name(): string | undefined;
43
+ /** World that owns this query; forwards to the backing entity. */
44
+ get world(): World;
45
+ get count(): number;
46
+ [Symbol.iterator](): IterableIterator<Entity>;
47
+ belongs(e: Entity): boolean;
48
+ has(e: Entity): boolean;
49
+ forEach(callback: (e: Entity) => void): this;
50
+ forEach<J extends FanInjectTuple>(components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
51
+ forEach<J extends FanInjectTuple>(cursor: typeof Entity, components: readonly [...J], callback: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
52
+ forEach<J extends FanInjectTuple>(cursor: typeof Iter, components: readonly [...J], callback: (it: Iter, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
53
+ toString(): string;
54
+ with<const S extends readonly QuerySpec[]>(...specs: [...S]): Query<[...R, ...ExtractSpecsRequired<S>]>;
55
+ without(dsl: QueryDSL): this;
56
+ track(): this;
57
+ orderBy<J extends InjectTuple>(components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
58
+ orderBy<J extends InjectTuple>(cursor: typeof Entity, components: readonly [...J], compare: (entityA: Entity, a: MaybeResolvedInjectTuple<J, R>, entityB: Entity, b: MaybeResolvedInjectTuple<J, R>) => number): this;
59
+ orderBy<J extends InjectTuple>(cursor: typeof Iter, components: readonly [...J], compare: (a: Iter, aResolved: MaybeResolvedInjectTuple<J, R>, b: Iter, bResolved: MaybeResolvedInjectTuple<J, R>) => number): this;
60
+ cascade(rel: ComponentRef): this;
61
+ cascade(rel: ComponentRef, compare: (a: Entity, b: Entity) => number): this;
62
+ groupBy<K, J extends FanInjectTuple>(components: readonly [...J], key: (e: Entity, resolved: MaybeResolvedInjectTuple<J, R>) => K): GroupedQuery<K, R>;
63
+ groupBy(relationship: ComponentRef): GroupedQuery<Entity, R>;
64
+ ignoreSource(source: QueryDSL | Query): this;
65
+ enter<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
66
+ enter<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
67
+ enter<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
68
+ enter(callback: (e: Entity) => void): this;
69
+ exit<J extends InjectTuple>(inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
70
+ exit<J extends InjectTuple>(cursor: typeof Entity, inject: readonly [...J], callback: (e: Entity, injected: RequiredResolvedInjectTuple<J>) => void): this;
71
+ exit<J extends InjectTuple>(cursor: typeof Iter, inject: readonly [...J], callback: (it: Iter, injected: RequiredResolvedInjectTuple<J>) => void): this;
72
+ exit(callback: (e: Entity) => void): this;
73
+ update<C extends ComponentType>(ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
74
+ update<C extends ComponentType, J extends InjectTuple>(ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
75
+ update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Entity, ComponentClass: C, inject: readonly [...J], callback: (e: Entity, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
76
+ update<C extends ComponentType>(cursor: typeof Entity, ComponentClass: C, callback: (e: Entity, c: InstanceType<C>) => void): this;
77
+ update<C extends ComponentType, J extends InjectTuple>(cursor: typeof Iter, ComponentClass: C, inject: readonly [...J], callback: (it: Iter, c: InstanceType<C>, injected: MaybeResolvedInjectTuple<J, R>) => void): this;
78
+ build(): this;
52
79
  destroy(): void;
80
+ onTermEvent(kind: TermEventKind, entity: Entity): void;
81
+ private _buildSilenceQuery;
82
+ private _reSortCascade;
53
83
  }
@@ -1,9 +1,13 @@
1
- import { _resolveRelationship } from "../dsl.js";
2
- import { Entity } from "../entity/index.js";
3
- import { directInjectEids, getInjected, injectArity, mapInject, } from "../inject.js";
4
- import { _setGroupedQueryCtor } from "./query.00.base.js";
5
- import { Grouping } from "./query.07.groups.js";
6
- import { Groups } from "./query.07.groups.js";
1
+ import { containsDownTerm, isQueryConfig, } from "../dsl.js";
2
+ import { forEachInjected, } from "../inject.js";
3
+ import { SilenceSource, Traversable } from "../modules/relationships.js";
4
+ import { ArrayMap } from "../util/array_map.js";
5
+ import { Bitset } from "../util/bitset.js";
6
+ import { OrderedSet } from "../util/ordered_set.js";
7
+ import { makeEnterCallback, makeExitCallback, makeSortedEntitySet, makeUpdateRegistration, } from "./callbacks.js";
8
+ import { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
9
+ import { getGroupedQueryPrototype } from "./grouped_query_registry.js";
10
+ const EMPTY_ENTITIES = new Set();
7
11
  /**
8
12
  * A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
9
13
  * predicate.
@@ -23,116 +27,358 @@ import { Groups } from "./query.07.groups.js";
23
27
  * you want a reactive entity set without pipeline integration.
24
28
  *
25
29
  * @typeParam R - Component classes guaranteed present on every matched entity
26
- * (declared via {@link requires} or the `_guaranteed` hint of {@link query}).
27
- * Components in `R` appear as non-nullable in {@link sort}, {@link forEach},
30
+ * (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
31
+ * Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
28
32
  * and {@link update} callback tuples.
29
33
  */
30
- export class Query extends Groups {
34
+ export class Query {
31
35
  constructor(name, world, track = true) {
32
- super(name, world, Query, track);
36
+ /** True when membership or watched component data changed since the last reset. */
37
+ this.changed = false;
38
+ /** @internal DSL predicate used to build the root membership term. */
39
+ this._dsl = undefined;
40
+ /** @internal `enter` callback (already wraps any injection logic). */
41
+ this._enterCallback = undefined;
42
+ /** @internal `exit` callback (already wraps any injection logic). */
43
+ this._exitCallback = undefined;
44
+ /** @internal Component eids the exit callback needs snapshotted before component removal. */
45
+ this._exitSnapshotTypes = undefined;
46
+ /** @internal Whether membership APIs are enabled for this query. */
47
+ this._tracking = false;
48
+ /** @internal Bitmask of component eids this query reacts to via `update`. */
49
+ this._watchlistBitmask = new Bitset();
50
+ /** @internal `true` once this query has been registered with its world. */
51
+ this._built = false;
52
+ /** @internal Guards destroy hooks against recursive removal. */
53
+ this._destroyed = false;
54
+ /** @internal `true` once `with` has set an explicit predicate. */
55
+ this._hasExplicitQuery = false;
56
+ /** @internal Per-component-eid `update` callbacks. */
57
+ this._componentUpdateCallbacks = new ArrayMap();
58
+ this._queryComponentClass = Query;
59
+ this.entity = world.entity();
60
+ this.entity.name = name;
61
+ this.entity.attach(Query, this);
62
+ world._addUnbuiltQuery(this);
63
+ if (track) {
64
+ this.track();
65
+ }
66
+ }
67
+ /* -------------------------------------------------------------------------
68
+ * Identity And Membership Views
69
+ * -------------------------------------------------------------------------
70
+ * Read-only accessors over the backing entity and current matched set. These
71
+ * methods do not change query configuration or world registration state.
72
+ */
73
+ /** `true` once this query has been registered with its world. */
74
+ get built() {
75
+ return this._built;
76
+ }
77
+ /** Unique display name; forwards to the backing entity identity. */
78
+ get name() {
79
+ return this.entity.name;
80
+ }
81
+ /** World that owns this query; forwards to the backing entity. */
82
+ get world() {
83
+ return this.entity.world;
84
+ }
85
+ get count() {
86
+ if (!this._tracking) {
87
+ return 0;
88
+ }
89
+ return this._entities?.size ?? this.rootTerm?.count ?? 0;
90
+ }
91
+ [Symbol.iterator]() {
92
+ return this._matchedEntities()[Symbol.iterator]();
93
+ }
94
+ belongs(e) {
95
+ return this.rootTerm?.has(e) ?? false;
96
+ }
97
+ has(e) {
98
+ if (!this._tracking) {
99
+ return false;
100
+ }
101
+ return this._entities?.has(e) ?? this.rootTerm?.has(e) ?? false;
102
+ }
103
+ forEach(arg0, arg1, arg2) {
104
+ this.changed = false;
105
+ this._forEach(arg0, arg1, arg2);
106
+ return this;
107
+ }
108
+ /**
109
+ * @internal Iterate the matched entities with injection, **without**
110
+ * consuming the {@link changed} flag. Used by `System.each`, which runs every
111
+ * tick and must not reset `changed` (that flag tracks whether membership or
112
+ * watched data changed since the caller last read it).
113
+ */
114
+ _forEach(arg0, arg1, arg2) {
115
+ forEachInjected(this.world, this._matchedEntities(), arg0, arg1, arg2);
116
+ }
117
+ toString() {
118
+ return this.name ?? "";
119
+ }
120
+ /* -------------------------------------------------------------------------
121
+ * Predicate And Membership Configuration
122
+ * -------------------------------------------------------------------------
123
+ * Fluent builder methods that decide which entities belong to the query and
124
+ * how that membership is tracked, ordered, grouped, or source-filtered.
125
+ */
126
+ with(...specs) {
127
+ this._assertConfigurable();
128
+ const terms = [];
129
+ let cascade;
130
+ for (const spec of specs) {
131
+ if (isQueryConfig(spec)) {
132
+ terms.push(spec.with);
133
+ if (spec.cascade !== undefined) {
134
+ cascade = spec.cascade;
135
+ }
136
+ }
137
+ else {
138
+ terms.push(spec);
139
+ }
140
+ }
141
+ this._dsl = this._dsl === undefined ? { all: terms } : { all: [this._dsl, ...terms] };
142
+ this._hasExplicitQuery = true;
143
+ if (cascade !== undefined) {
144
+ this.cascade(cascade);
145
+ }
146
+ return this;
147
+ }
148
+ without(dsl) {
149
+ this.with({ not: dsl });
150
+ return this;
151
+ }
152
+ track() {
153
+ this._assertConfigurable();
154
+ this._tracking = true;
155
+ return this;
156
+ }
157
+ orderBy(arg0, arg1, arg2) {
158
+ this._assertConfigurable();
159
+ this._tracking = true;
160
+ this._entities = makeSortedEntitySet(this.world, arg0, arg1, arg2);
161
+ return this;
162
+ }
163
+ cascade(rel, compare) {
164
+ this._assertConfigurable();
165
+ const relEntity = this.world.entity(rel);
166
+ const relMeta = relEntity.meta;
167
+ if (!relMeta.isRelationship) {
168
+ throw new Error(`Component ${relMeta.Class.name} is not a Relationship`);
169
+ }
170
+ const traversable = relEntity.get(Traversable);
171
+ if (!traversable) {
172
+ throw new Error(`Relationship ${relMeta.Class.name} does not have the Traversable trait`);
173
+ }
174
+ const depths = traversable.depths;
175
+ this.orderBy([], (a, _ra, b) => {
176
+ const da = depths.get(a) ?? -1;
177
+ const db = depths.get(b) ?? -1;
178
+ return da - db || compare?.(a, b) || 0;
179
+ });
180
+ this.update(relMeta.Class, (entity) => {
181
+ this._reSortCascade(entity, relMeta.eid);
182
+ });
183
+ return this;
184
+ }
185
+ groupBy(arg0, arg1) {
186
+ this._assertConfigurable();
187
+ Object.setPrototypeOf(this, getGroupedQueryPrototype());
188
+ return this._initialize(arg0, arg1);
189
+ }
190
+ ignoreSource(source) {
191
+ this._assertConfigurable();
192
+ const query = typeof source === "object" && !Array.isArray(source) && "entity" in source
193
+ ? source
194
+ : this._buildSilenceQuery(source);
195
+ this.entity.set(SilenceSource, { target: query.entity });
196
+ this._silenceQuery = query;
197
+ return this;
198
+ }
199
+ enter(arg0, arg1, arg2) {
200
+ this._assertConfigurable();
201
+ this._enterCallback = makeEnterCallback(this.world, arg0, arg1, arg2);
202
+ return this;
203
+ }
204
+ exit(arg0, arg1, arg2) {
205
+ this._assertConfigurable();
206
+ const exit = makeExitCallback(this.world, arg0, arg1, arg2);
207
+ this._exitCallback = exit.callback;
208
+ this._exitSnapshotTypes = exit.snapshotTypes;
209
+ return this;
210
+ }
211
+ update(arg0, arg1, arg2, arg3) {
212
+ this._assertConfigurable();
213
+ const { componentEid, callback } = makeUpdateRegistration(this.world, arg0, arg1, arg2, arg3);
214
+ this._componentUpdateCallbacks.set(componentEid, callback);
215
+ this._watchlistBitmask.add(componentEid);
216
+ if (!this._hasExplicitQuery) {
217
+ this._dsl = this._watchlistBitmask.indices();
218
+ }
219
+ return this;
220
+ }
221
+ /* -------------------------------------------------------------------------
222
+ * World Registration And Routing Hooks
223
+ * -------------------------------------------------------------------------
224
+ * Public internals called by World, terms, and System subclasses to register,
225
+ * destroy, and route membership/update events through the query.
226
+ */
227
+ build() {
228
+ if (this.built) {
229
+ return this;
230
+ }
231
+ if (this.world.deferred) {
232
+ this.world._addUnbuiltQuery(this);
233
+ return this;
234
+ }
235
+ return this._build();
33
236
  }
34
- }
35
- const EMPTY_GROUPS = new Map();
36
- /**
37
- * A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
38
- * typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
39
- * the query's usual reactive membership.
40
- *
41
- * `GroupedQuery` lives in the query module alongside `Query`. Instances are
42
- * created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
43
- *
44
- * @typeParam K - The grouping key type produced by the key function (or the
45
- * relationship target entity, for the relationship form).
46
- * @typeParam R - Component classes guaranteed present on every matched entity.
47
- */
48
- export class GroupedQuery extends Query {
49
237
  /** @internal */
50
- _initialize(arg0, arg1) {
51
- if (this._grouping !== undefined) {
52
- throw `query '${this.name}' is already grouped`;
53
- }
54
- let keyOf;
55
- let watchEids;
56
- if (typeof arg1 === "function") {
57
- const components = arg0;
58
- const inject = mapInject(this.world, components);
59
- const arity = injectArity(inject);
60
- const resolved = new Array(arity);
61
- keyOf = (e) => {
62
- getInjected(e, inject, false, resolved);
63
- return arg1(e, resolved);
64
- };
65
- watchEids = directInjectEids(inject);
66
- this._composeGroupMembership(components);
238
+ _build() {
239
+ if (this.built) {
240
+ return this;
67
241
  }
68
- else {
69
- const relEid = _resolveRelationship(arg0, this.world);
70
- keyOf = (e) => e.parent(relEid);
71
- watchEids = [relEid];
72
- this._composeGroupMembership([arg0]);
242
+ if (!this._isBuildable()) {
243
+ this.destroy();
244
+ return this;
73
245
  }
74
- for (const eid of watchEids) {
75
- this._watchlistBitmask.add(eid);
246
+ this.world._removeUnbuiltQuery(this);
247
+ if (this._dsl !== undefined) {
248
+ if (this._tracking && containsDownTerm(this._dsl)) {
249
+ this.destroy();
250
+ throw new Error(SOURCE_TRACKED_QUERY_ERROR);
251
+ }
252
+ this.rootTerm = this.world.getTerm(this._dsl);
253
+ this._unsubscribeTerm = this.rootTerm.subscribe(this);
76
254
  }
77
- this.track();
78
- this._grouping = new Grouping(this.world, keyOf, watchEids);
255
+ this.world._addQuery(this);
256
+ this._built = true;
257
+ this._backfill();
79
258
  return this;
80
259
  }
81
260
  /** @internal */
261
+ _clearSilence() {
262
+ this._silenceQuery = undefined;
263
+ }
264
+ destroy() {
265
+ if (this._destroyed) {
266
+ return;
267
+ }
268
+ this._destroyed = true;
269
+ this.world._removeQuery(this);
270
+ this._entities?.clear();
271
+ this._entities = undefined;
272
+ this._tracking = false;
273
+ if (!this.entity._destroyed && this.entity.get(this._queryComponentClass) !== undefined) {
274
+ this.entity.destroy();
275
+ }
276
+ }
277
+ /** @internal */
82
278
  _enter(e) {
83
- this._grouping.enter(e);
84
- super._enter(e);
279
+ this.changed = true;
280
+ this._entities?.add(e);
281
+ e._addQueryMembership(this);
282
+ this._enterCallback?.(e);
283
+ e.components.forEach((c, ceid) => {
284
+ if (!this._watchlistBitmask.has(ceid)) {
285
+ return;
286
+ }
287
+ this._notifyModified(e, ceid, c);
288
+ });
85
289
  }
86
290
  /** @internal */
87
291
  _exit(e) {
88
- super._exit(e);
89
- this._grouping.exit(e);
292
+ this.changed = true;
293
+ this._exitCallback?.(e);
294
+ this._entities?.delete(e);
295
+ e._removeQueryMembership(this);
296
+ }
297
+ /** @internal */
298
+ _notifyModified(e, ceid, c) {
299
+ if (!this._watchlistBitmask.has(ceid)) {
300
+ return;
301
+ }
302
+ if (this._isSourceSilenced()) {
303
+ return;
304
+ }
305
+ this.changed = true;
306
+ const callback = this._componentUpdateCallbacks.get(ceid);
307
+ if (callback) {
308
+ callback(e, c);
309
+ }
310
+ }
311
+ onTermEvent(kind, entity) {
312
+ if (kind === 0 /* TermEventKind.Enter */) {
313
+ this._enter(entity);
314
+ }
315
+ else {
316
+ this._exit(entity);
317
+ }
90
318
  }
91
319
  /** @internal */
92
- _notifyModified(e, meta, c) {
93
- super._notifyModified(e, meta, c);
94
- this._grouping.refresh(e, meta.eid);
320
+ _unsubscribeRootTerm() {
321
+ this._unsubscribeTerm?.();
322
+ this._unsubscribeTerm = undefined;
323
+ this.rootTerm = undefined;
95
324
  }
96
325
  /** @internal */
97
326
  _watchesUpdates() {
98
- return super._watchesUpdates() || true;
327
+ return this._componentUpdateCallbacks.size > 0;
99
328
  }
100
- group(key) {
101
- return this._grouping?.get(key);
329
+ /** @internal Throw when a builder method is called after registration. */
330
+ _assertConfigurable() {
331
+ if (this.built) {
332
+ throw new Error(`query '${this.name}' has already been built`);
333
+ }
102
334
  }
103
- groups() {
104
- return (this._grouping?.groups.values() ?? EMPTY_GROUPS.values());
335
+ /** @internal */
336
+ _backfill() {
337
+ if (!this.rootTerm || !this._needsBackfill()) {
338
+ return;
339
+ }
340
+ this.world.defer(() => {
341
+ for (const e of this.rootTerm ?? EMPTY_ENTITIES) {
342
+ this._enter(e);
343
+ }
344
+ });
105
345
  }
106
- groupKeys() {
107
- return (this._grouping?.keys() ?? EMPTY_GROUPS.keys());
346
+ /** @internal Whether this object has enough configuration to enter the world. */
347
+ _isBuildable() {
348
+ return this._dsl !== undefined;
108
349
  }
109
- get groupCount() {
110
- return this._grouping?.groups.size ?? 0;
350
+ /** @internal Whether build-time matches are observable and need routing. */
351
+ _needsBackfill() {
352
+ return (this._tracking ||
353
+ this._enterCallback !== undefined ||
354
+ this._exitCallback !== undefined ||
355
+ this._watchesUpdates());
111
356
  }
112
- onGroupEnter(callback) {
113
- this._assertConfigurable();
114
- this._grouping?.setOnGroupEnter(callback);
115
- return this;
116
- }
117
- onGroupExit(callback) {
118
- this._assertConfigurable();
119
- this._grouping?.setOnGroupExit(callback);
120
- return this;
357
+ /** @internal */
358
+ _isSourceSilenced() {
359
+ const source = this.entity.world._routingSource;
360
+ return source !== undefined && this._silenceQuery?.has(source) === true;
121
361
  }
122
- _composeGroupMembership(refs) {
123
- const componentRefs = refs.filter((ref) => typeof ref === "number" || typeof ref === "function" || ref instanceof Entity);
124
- if (componentRefs.length === 0) {
125
- return;
362
+ /** @internal */
363
+ _matchedEntities() {
364
+ if (!this._tracking) {
365
+ return EMPTY_ENTITIES;
126
366
  }
127
- const existing = this._dsl ?? true;
128
- this._dsl = { all: [existing, ...componentRefs] };
129
- this._hasExplicitQuery = true;
367
+ return this._entities ?? this.rootTerm ?? EMPTY_ENTITIES;
130
368
  }
131
- destroy() {
132
- this._grouping?.clear();
133
- this._grouping = undefined;
134
- super.destroy();
369
+ _buildSilenceQuery(dsl) {
370
+ const q = this.world.query(`${this.name}:silence`).with(dsl);
371
+ q.entity.childOf(this.entity);
372
+ return q;
373
+ }
374
+ _reSortCascade(entity, relEid) {
375
+ const entities = this._entities;
376
+ if (entities instanceof OrderedSet) {
377
+ entities.reSort(entity);
378
+ }
379
+ for (const child of entity._childrenByEid(relEid) ?? []) {
380
+ this._reSortCascade(child, relEid);
381
+ }
135
382
  }
136
383
  }
137
- _setGroupedQueryCtor(GroupedQuery);
138
384
  //# sourceMappingURL=query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}