```typescript= type ComponentId = number; type ComponentMask = number; enum ComponentType { Data = "data", Tag = "tag" } type ComponentInfo = { id: ComponentId; mask: ComponentMask; component: Component; type: ComponentType; } type IsTag = { // impl } type ComponentInfos = Map<ComponentId, ComponentInfo> type Worlds = Map<WorldId, World> export function get_or_register(component: Component) { return runtime.components.get(get_component_id(component)) ?? register_component(component); } type WithId<T> = T & { [COMPONENT_ID_PROP_KEY]: ComponentId }; export function get_component_id(component: WithId<Component>) { return component[COMPONENT_ID_PROP_KEY]; } export function is_tag(component: Component) { return runtime.components.get(get_component_id(component)).type === ComponentType.Tag; } function is_tag_internal() { return // member of ComponentType } function register_component(component: Component) { const info = { id: ++runtime.component_counter, mask: 1 << runtime.component_counter, component, type: is_tag_internal() } runtime.component.set(runtime.component_counter, info); return info; } // component-flags enum ComponentFlags { Empty = 0, Added = 1 << 1, Changed = 1 << 2, Removed = 1 << 3 } ``` ```typescript= // constants.ts const SYMBOL_PREFIX = `$$_${package.name}__`; const GLOBAL_CONTEXT_KEY = defsymbol("global_context"); const COMPONENT_ID_PROP_KEY = defsymbol("component_id"); const defsymbol = (name: string) => Symbol(`${SYMBOL_PREFIX}${name}`); ``` ```typescript= // global/index.ts type Global = { runtime: Runtime; } globalThis[GLOBAL_CONTEXT_KEY] = { } as Partial<Global>; export const global_context = globalThis[GLOBAL_CONTEXT_KEY] as Global; // global/runtime.ts type Runtime = { world: Worlds; current_world: WorldId; components: ComponentInfos; component_counter: ComponentId; } global_context.runtime = { worlds: new Map(), currentWorld: -1, components: new Map(), component_counter: ComponentId; } export const runtime = global_context.runtime; ``` ```typescript= type Disposable = { dispose(): unknown; } if (instance?.dispose) { instance.dispose() } ``` ```typescript= type record = Record<string, any> type ResourceId = number; type Resource<T extends record = record> = Type<T>; type ResourceInstance<T extends record = record> = InstanceType<Resource<T>> type Resources = Map<Resource, ResourceInstance> function add_resource(resource: Resource | ResourceInstance) { const [instance, type] = get_type_and_instance(resource) this.resources.set(type, instance); } function get_type_and_instance(target: record | Type<record>) { // If target constructor is Function, then target itself is a constructor if(target.constructor === Function) { return [new traget(), target] } else { return [target, target.constructor] } } ``` ```typescript= type ComponentBundle = readonly (Component | ComponentInstance)[]; type World = { batch(size: number, components: ComponentBundle): Entity; spawn(...components: ComponentBundle): Entity; despawn(entity: Entity): boolean; add(...component: ComponentBundle): void; get<T extends Component>(component: T): T; remove(component: Component): void; has(component: Component): boolean; contains(entity: Entity): boolean; update(): void query<T extends QueryParams(...params: T): Query<T>; iter(): Iterable<Entity>; } ```