# todo
* `stages` https://github.com/bevyengine/bevy/blob/b17f8a4bce5551b418654fffb1fe97ff0f9852f0/crates/bevy_app/src/lib.rs
* `world.single` (get a single entity for a component) throw if there exists more??
* `super components` components should follow OOP fetches, eg. if example Light is extended from Object3D, query(Object3D) will get both Light & Object3D entities.
```typescript=
export type ComponentStorage = {
insert(entity: Entity, value: ComponentInstance, flags: ComponentFlags): ComponentInstance;
remove(entity: Entity): boolean;
get(entity: Entity): ComponentInstance;
has(entity: Entity): boolean;
set_flag(entity: Entity, fn: (flag: ComponentFlags) => ComponentFlags): void;
get_with_flags(entity: Entity): [ComponentInstance, ComponentFlags];
clear_flags(): void;
realloc(length?: number): void;
empty(): boolean;
readonly length: number;
readonly capacity: number;
}
export class DerivedComponentStorage {
}
```
```typescript=
class Point {}
class Point2D extends Point {}
class Point3D extends Point2D {}
class Point4D extends Point3D {}
class Point5D extends Point4D {}
class Point6D extends Point5D {}
class Point7D extends Point6D {}
class FloatPoint extends Point {}
class Bar {}
class Foo extends Bar {}
function find_closest_ancestor(classes) {
const nodes = [];
for (const cls of classes) {
const ancestors = classes.filter((x) => cls.prototype instanceof x);
if (ancestors.length === 0) {
nodes.push({ parent: undefined, self: cls });
continue;
}
if (ancestors.length === 1) {
nodes.push({ parent: ancestors[0], self: cls });
continue;
}
let ancestorsWith = Array.from(ancestors).map(x => ({ value: 0, type: x }));
for(let i = 0; i < ancestorsWith.length; i++) {
const current = ancestorsWith[i];
for(let j = 0; j < ancestorsWith.length; j++) {
if (i === j) continue;
const other = ancestorsWith[j];
current.value += other.type.prototype instanceof current.type ? 1 : 0;
}
}
ancestorsWith.sort((a, b) => ( a.value - b.value));
nodes.push({ parent: ancestorsWith[0].type, self: cls });
}
return nodes;
}
function func(a, b) {
return 0.5 - Math.random();
}
find_closest_ancestor([Point, Point2D, Point3D, Point4D, Point5D, Point6D, Point7D].sort(func))
```
```typescript
import { World, query } from "dreki";
import { not, observe } from "dreki/filters";
const world = World.build()
.with({ capacity: 200 })
.systems(added_sys)
.done();
function added_sys() {
for (const [pos] of query(not(Dead), observe(Position)) {
pos.x += 9999;
}
};
```