export class Query { constructor(include, exclude) { this.include = include; this.exclude = exclude; this.isDirty = true; this.results = new Array(); this.includeComponentIds = include.map((component) => component.id); this.excludeComponentIds = exclude.map((component) => component.id); } execute(world) { if (!this.isDirty && this.results) { return this.results; } let filtered; const entities = world.entities.filter(entity => { let ids = entity.components.map(component => component.id); let includes = ids.map(id => this.includeComponentIds.includes(id)).includes(true); let excludes = ids.map(id => this.excludeComponentIds.includes(id)).includes(true); return includes && !excludes; }); if (entities.length > 0) { this.isDirty = false; this.results = entities; } return entities; } }