Skip to content

Commit 065c1fc

Browse files
authored
Merge pull request #146 from pmndrs/refactor/remove-modifier-data-class
♻️ core: remove ModifierData class
2 parents 725a0c0 + 101aa55 commit 065c1fc

File tree

10 files changed

+65
-41
lines changed

10 files changed

+65
-41
lines changed

packages/core/src/query/modifier.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
import { $internal } from '../common';
2-
import type { Trait } from '../trait/types';
2+
import { Trait } from '../trait/types';
3+
import { ModifierData, QueryParameter } from './types';
34

4-
export class ModifierData<TTrait extends Trait[] = Trait[], TType extends string = string> {
5-
traitIds: number[];
5+
export const $modifier = Symbol('modifier');
66

7-
constructor(
8-
public type: TType,
9-
public id: number,
10-
public traits: TTrait
11-
) {
12-
this.traitIds = traits.map((trait) => trait[$internal].id);
13-
}
7+
export function createModifier<TTrait extends Trait[] = Trait[], TType extends string = string>(
8+
type: TType,
9+
id: number,
10+
traits: TTrait
11+
): ModifierData<TTrait, TType> {
12+
return {
13+
[$modifier]: true,
14+
type,
15+
id,
16+
traits,
17+
traitIds: traits.map((trait) => trait[$internal].id),
18+
} as const;
19+
}
20+
21+
export function isModifier(param: QueryParameter): param is ModifierData {
22+
return $modifier in param;
1423
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Trait } from '../../trait/types';
22
import { universe } from '../../universe/universe';
3-
import { ModifierData } from '../modifier';
3+
import { createModifier } from '../modifier';
44
import { createTrackingId, setTrackingMasks } from '../utils/tracking-cursor';
55

66
export function createAdded() {
@@ -11,6 +11,7 @@ export function createAdded() {
1111
setTrackingMasks(world.deref()!, id);
1212
}
1313

14-
return <T extends Trait[] = Trait[]>(...traits: T) =>
15-
new ModifierData<T>(`added-${id}`, id, traits);
14+
return <T extends Trait[] = Trait[]>(...traits: T) => {
15+
return createModifier(`added-${id}`, id, traits);
16+
};
1617
}

packages/core/src/query/modifiers/changed.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { hasTrait, registerTrait } from '../../trait/trait';
55
import type { Trait } from '../../trait/types';
66
import { universe } from '../../universe/universe';
77
import type { World } from '../../world/world';
8-
import { ModifierData } from '../modifier';
8+
import { createModifier } from '../modifier';
99
import { createTrackingId, setTrackingMasks } from '../utils/tracking-cursor';
1010

1111
export function createChanged() {
@@ -16,8 +16,9 @@ export function createChanged() {
1616
setTrackingMasks(world.deref()!, id);
1717
}
1818

19-
return <T extends Trait[] = Trait[]>(...traits: T) =>
20-
new ModifierData<T>(`changed-${id}`, id, traits);
19+
return <T extends Trait[] = Trait[]>(...traits: T) => {
20+
return createModifier(`changed-${id}`, id, traits);
21+
};
2122
}
2223

2324
export function setChanged(world: World, entity: Entity, trait: Trait) {
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type { Trait } from '../../trait/types';
2-
import { ModifierData } from '../modifier';
2+
import { createModifier } from '../modifier';
33

4-
export const Not = <T extends Trait[] = Trait[]>(...traits: T) => new ModifierData('not', 1, traits);
4+
export const Not = <T extends Trait[] = Trait[]>(...traits: T) => {
5+
return createModifier('not', 1, traits);
6+
};
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type { Trait } from '../../trait/types';
2-
import { ModifierData } from '../modifier';
2+
import { createModifier } from '../modifier';
33

4-
export const Or = <T extends Trait[] = Trait[]>(...traits: T) => new ModifierData('or', 2, traits);
4+
export const Or = <T extends Trait[] = Trait[]>(...traits: T) => {
5+
return createModifier('or', 2, traits);
6+
};
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Trait } from '../../trait/types';
22
import { universe } from '../../universe/universe';
3-
import { ModifierData } from '../modifier';
3+
import { createModifier } from '../modifier';
44
import { createTrackingId, setTrackingMasks } from '../utils/tracking-cursor';
55

66
export function createRemoved() {
@@ -11,6 +11,7 @@ export function createRemoved() {
1111
setTrackingMasks(world.deref()!, id);
1212
}
1313

14-
return <T extends Trait[] = Trait[]>(...traits: T) =>
15-
new ModifierData<T>(`removed-${id}`, id, traits);
14+
return <T extends Trait[] = Trait[]>(...traits: T) => {
15+
return createModifier(`removed-${id}`, id, traits);
16+
};
1617
}

packages/core/src/query/query-result.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { getStore } from '../trait/trait';
55
import type { Store, Trait } from '../trait/types';
66
import { shallowEqual } from '../utils/shallow-equal';
77
import type { World } from '../world/world';
8-
import { ModifierData } from './modifier';
8+
import { isModifier } from './modifier';
99
import { setChanged } from './modifiers/changed';
1010
import type { Query } from './query';
1111
import type {
@@ -245,7 +245,7 @@ export function createQueryResult<T extends QueryParameter[]>(
245245
for (let i = 0; i < params.length; i++) {
246246
const param = params[i];
247247

248-
if (param instanceof ModifierData) {
248+
if (isModifier(param)) {
249249
// Skip not modifier.
250250
if (param.type === 'not') continue;
251251

packages/core/src/query/query.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { registerTrait, trait } from '../trait/trait';
55
import type { Trait, TraitData } from '../trait/types';
66
import { SparseSet } from '../utils/sparse-set';
77
import type { World } from '../world/world';
8-
import { ModifierData } from './modifier';
8+
import { isModifier } from './modifier';
99
import type { QueryParameter, QuerySubscriber } from './types';
1010
import { createQueryHash } from './utils/create-query-hash';
1111

@@ -63,7 +63,7 @@ export class Query {
6363
for (let i = 0; i < parameters.length; i++) {
6464
const parameter = parameters[i];
6565

66-
if (parameter instanceof ModifierData) {
66+
if (isModifier(parameter)) {
6767
const traits = parameter.traits;
6868

6969
// Register traits if they don't exist.

packages/core/src/query/types.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type {
77
Trait,
88
TraitInstance,
99
} from '../trait/types';
10-
import type { ModifierData } from './modifier';
10+
import { $modifier } from './modifier';
1111

1212
export type QueryModifier = (...components: Trait[]) => ModifierData;
1313
export type QueryParameter = Trait | ReturnType<QueryModifier>;
@@ -37,15 +37,15 @@ export type StoresFromParameters<T extends QueryParameter[]> = T extends [infer
3737
...(First extends Trait
3838
? [ExtractStore<First>]
3939
: First extends ModifierData
40-
? StoresFromParameters<UnwrapModifierData<First>>
41-
: []),
42-
...(Rest extends QueryParameter[] ? StoresFromParameters<Rest> : []),
43-
]
40+
? StoresFromParameters<UnwrapModifierData<First>>
41+
: []),
42+
...(Rest extends QueryParameter[] ? StoresFromParameters<Rest> : [])
43+
]
4444
: [];
4545

4646
export type InstancesFromParameters<T extends QueryParameter[]> = T extends [
4747
infer First,
48-
...infer Rest,
48+
...infer Rest
4949
]
5050
? [
5151
...(First extends Trait
@@ -55,12 +55,12 @@ export type InstancesFromParameters<T extends QueryParameter[]> = T extends [
5555
: [TraitInstance<First>]
5656
: []
5757
: First extends ModifierData
58-
? IsNotModifier<First> extends true
59-
? []
60-
: InstancesFromParameters<UnwrapModifierData<First>>
61-
: []),
62-
...(Rest extends QueryParameter[] ? InstancesFromParameters<Rest> : []),
63-
]
58+
? IsNotModifier<First> extends true
59+
? []
60+
: InstancesFromParameters<UnwrapModifierData<First>>
61+
: []),
62+
...(Rest extends QueryParameter[] ? InstancesFromParameters<Rest> : [])
63+
]
6464
: [];
6565

6666
export type IsNotModifier<T> = T extends ModifierData<Trait[], infer TType>
@@ -73,3 +73,11 @@ const $parameters = Symbol();
7373
export type QueryHash<T extends QueryParameter[]> = string & {
7474
readonly [$parameters]: T;
7575
};
76+
77+
export type ModifierData<TTrait extends Trait[] = Trait[], TType extends string = string> = {
78+
[$modifier]: true;
79+
type: TType;
80+
id: number;
81+
traits: TTrait;
82+
traitIds: number[];
83+
};

packages/core/src/query/utils/create-query-hash.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { $internal } from '../../';
2-
import { ModifierData } from '../modifier';
2+
import { isModifier } from '../modifier';
33
import type { QueryParameter } from '../types';
44

55
const sortedIDs = new Float32Array(1024);
@@ -10,7 +10,7 @@ export const createQueryHash = (parameters: QueryParameter[]) => {
1010

1111
for (let i = 0; i < parameters.length; i++) {
1212
const param = parameters[i];
13-
if (param instanceof ModifierData) {
13+
if (isModifier(param)) {
1414
const modifierId = param.id;
1515
const traitIds = param.traitIds;
1616

0 commit comments

Comments
 (0)