{
  "version": 3,
  "sources": ["../src/index.ts", "../src/ecs/ecs-entity.ts", "../src/query/query.spec.ts", "../src/query/_.ts", "../src/entity/entity.ts", "../src/query/query.util.ts", "../src/query/query.ts", "../src/query/entities-query.ts", "../src/query/components-query.ts", "../src/ecs/ecs-query.ts", "../src/ecs/ecs-sync-point.ts", "../src/world/world-builder.util.ts", "../src/system/_.ts", "../src/world/error.ts", "../src/scheduler/pipeline/stage.ts", "../src/scheduler/pipeline/sync-point.ts", "../src/scheduler/pipeline/pipeline.ts", "../src/system/system.spec.ts", "../src/system/system-builder.ts", "../src/events/internal-events.ts", "../src/system/system.ts", "../src/scheduler/scheduler.ts", "../src/serde/serde.spec.ts", "../src/serde/serial-format.ts", "../src/serde/referencing.spec.ts", "../src/serde/referencing.ts", "../src/serde/default-handlers.ts", "../src/serde/serde.ts", "../src/entity/entity-builder.ts", "../src/world/common/world_entities.ts", "../src/world/common/world_resources.ts", "../src/world/common/world_groups.ts", "../src/world/preptime/preptime-world_entities.ts", "../src/world/preptime/preptime-world_resources.ts", "../src/world/preptime/preptime-world_prefabs.ts", "../src/world/common/world_misc.ts", "../src/world/runtime/runtime-world_prefabs.ts", "../src/world/runtime/runtime-world_entities.ts", "../src/world/runtime/runtime-world_resources.ts", "../src/pda/pda.ts", "../src/pda/sim-ecs-pda.ts", "../src/events/event-reader.ts", "../src/world/runtime/runtime-world_states.ts", "../src/events/event-writer.ts", "../src/events/event-bus.ts", "../src/world/runtime/commands/command-entity-builder.ts", "../src/world/runtime/commands/commands.ts", "../src/world/runtime/runtime-world_events.ts", "../src/world/runtime/runtime-world.ts", "../src/state/state.ts", "../src/world/preptime/preptime-world.ts", "../src/world/world-builder.ts", "../src/ecs/ecs-world.ts", "../src/world/events.ts"],
  "sourcesContent": ["export * from './ecs/ecs-entity.ts';\r\nexport * from './ecs/ecs-query.ts';\r\nexport * from './ecs/ecs-sync-point.ts';\r\nexport * from './ecs/ecs-world.ts';\r\nexport * from './entity/entity.ts';\r\nexport * from './entity/entity-builder.ts';\r\nexport * from './query/query.ts';\r\nexport * from './events/event-bus.ts';\r\nexport * from './pda/sim-ecs-pda.ts';\r\n\r\n// Scheduler exports\r\nexport * from './scheduler/scheduler.ts';\r\nexport * from './scheduler/pipeline/pipeline.ts';\r\nexport * from './scheduler/pipeline/stage.ts';\r\nexport * from './scheduler/pipeline/sync-point.ts';\r\n\r\nexport * from './serde/serde.ts';\r\nexport * from './serde/serial-format.ts';\r\nexport * from './state/state.ts';\r\nexport * from './system/system.ts';\r\nexport * from './system/system-builder.ts';\r\nexport * from './world/error.ts';\r\nexport * from './world/error.spec.ts';\r\nexport * from './world/events.ts';\r\nexport * from './world/actions.spec.ts';\r\nexport * from './world/world.spec.ts';\r\nexport * from './world/preptime/preptime-world.ts';\r\nexport * from './world/runtime/runtime-world.ts';\r\nexport * from './world/world-builder.ts';\r\n", "import type {IEntity, TEntityId} from \"../entity/entity.spec.ts\";\r\n\r\nconst entities = new Map<TEntityId, WeakRef<IEntity>>();\r\n\r\n\r\n/**\r\n * Remove any referenced deleted entities\r\n */\r\nexport function clearRegistry(): void {\r\n    let entity;\r\n    let entityRef;\r\n\r\n    for (entityRef of entities.values()) {\r\n        entity = entityRef.deref();\r\n\r\n        if (entity) {\r\n            unregisterEntity(entity);\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Get a tracked entity\r\n * @param id\r\n */\r\nexport function getEntity(id: TEntityId): IEntity | undefined {\r\n    return entities.get(id)?.deref();\r\n}\r\n\r\n/**\r\n * Register an entity by its ID\r\n * @param entity\r\n */\r\nexport function registerEntity(entity: Readonly<IEntity>) {\r\n    entities.set(entity.id, new WeakRef(entity));\r\n}\r\n\r\n/**\r\n * Remove an entity\r\n * @param entity\r\n */\r\nexport function unregisterEntity(entity: Readonly<IEntity>): void {\r\n    unregisterEntityId(entity.id);\r\n}\r\n\r\n/**\r\n * Remove an entity by id\r\n * @param id\r\n */\r\nexport function unregisterEntityId(id: TEntityId): void {\r\n    entities.delete(id);\r\n}\r\n", "import type {TObjectProto, TTypeProto} from \"../_.spec.ts\";\r\nimport type {IEntity, TTag} from \"../entity/entity.spec.ts\";\r\nimport type {accessDescSym, addEntitySym, clearEntitiesSym, existenceDescSym, removeEntitySym, setEntitiesSym} from \"./_.ts\";\r\n\r\nexport type TAccessQueryParameter<C extends TObjectProto> = C & IAccessDescriptor<InstanceType<C>>;\r\nexport type TOptionalAccessQueryParameter<C extends TObjectProto | undefined> = IAccessDescriptor<C extends TObjectProto ? InstanceType<C> : undefined> & C extends TObjectProto ? C : undefined;\r\nexport interface IAccessQuery<C extends TObjectProto> { [componentName: string]: TAccessQueryParameter<C> | TOptionalAccessQueryParameter<C> }\r\n\r\nexport type TExistenceQueryParameter<C extends TObjectProto> = IExistenceDescriptor<C>;\r\nexport type TExistenceQuery<C extends TObjectProto> = Array<TExistenceQueryParameter<C>>;\r\n\r\nexport enum EAccess {\r\n    meta,\r\n    read,\r\n    write,\r\n}\r\n\r\nexport enum EExistence {\r\n    set,\r\n    unset,\r\n}\r\n\r\nexport enum ETargetType {\r\n    component,\r\n    entity,\r\n    tag,\r\n}\r\n\r\nexport enum EQueryType {\r\n    Components,\r\n    Entities,\r\n}\r\n\r\nexport type TAccessQueryData<DESC extends IAccessQuery<TObjectProto>> = {\r\n    [P in keyof DESC]: DESC[P] extends TAccessQueryParameter<TObjectProto>\r\n        ? Required<Omit<InstanceType<DESC[P]>, keyof IAccessDescriptor<object>>>\r\n        : (Required<Omit<InstanceType<DESC[P]>, keyof IAccessDescriptor<object>>> | undefined)\r\n}\r\n\r\nexport interface IAccessDescriptor<C extends object | undefined> {\r\n    /**\r\n     * @internal\r\n     */\r\n    [accessDescSym]: {\r\n        readonly data?: string\r\n        readonly optional: boolean\r\n        readonly target: TTypeProto<C> | TTag\r\n        readonly targetType: ETargetType\r\n        readonly type: EAccess\r\n    }\r\n}\r\n\r\nexport interface IExistenceDescriptor<C extends TObjectProto> {\r\n    /**\r\n     * @internal\r\n     */\r\n    [existenceDescSym]: {\r\n        readonly target: Readonly<C> | TTag\r\n        readonly targetType: ETargetType\r\n        readonly type: EExistence\r\n    }\r\n}\r\n\r\nexport interface IQuery<DESC, DATA> {\r\n    readonly descriptor: Readonly<DESC>\r\n    readonly queryType: EQueryType\r\n    readonly resultLength: number\r\n\r\n    /** @internal */\r\n    [addEntitySym](entity: Readonly<IEntity>): void\r\n    /** @internal */\r\n    [clearEntitiesSym](): void\r\n    /** @internal */\r\n    [removeEntitySym](entity: Readonly<IEntity>): void\r\n    /** @internal */\r\n    [setEntitiesSym](entities: Readonly<IterableIterator<Readonly<IEntity>>>): void\r\n\r\n    execute(handler: (data: DATA) => Promise<void> | void): Promise<void>\r\n    getFirst(): DATA | undefined\r\n    iter(): IterableIterator<DATA>\r\n    matchesEntity(entity: Readonly<IEntity>): boolean\r\n    toArray(): Array<DATA>\r\n}\r\n\r\nexport interface IComponentsQuery<DESC extends IAccessQuery<TObjectProto>> extends IQuery<DESC, TAccessQueryData<DESC>> {}\r\nexport interface IEntitiesQuery extends IQuery<TExistenceQuery<TObjectProto>, IEntity> {}\r\n", "export const addEntitySym: unique symbol = Symbol();\r\nexport const clearEntitiesSym: unique symbol = Symbol();\r\nexport const removeEntitySym: unique symbol = Symbol();\r\nexport const setEntitiesSym: unique symbol = Symbol();\r\n\r\nexport const accessDescSym: unique symbol = Symbol();\r\nexport const existenceDescSym: unique symbol = Symbol();\r\n", "import type {IEntity, TEntityId, TTag} from \"./entity.spec.ts\";\r\nimport type {TObjectProto, TTypeProto} from \"../_.spec.ts\";\r\nimport {registerEntity} from \"../ecs/ecs-entity.ts\";\r\nimport type {ISerDe} from \"../serde/serde.spec.ts\";\r\n\r\nexport * from './entity.spec';\r\n\r\nlet idCounter = BigInt(0);\r\n\r\nexport class Entity implements IEntity {\r\n    static uuidFn: () => TEntityId = () => `${Date.now()}_${(idCounter++).toString()}`;\r\n    protected components: Map<Readonly<TObjectProto>, /* mut */ object> = new Map();\r\n    protected tags: Set<TTag> = new Set();\r\n    protected uuid: TEntityId;\r\n\r\n    constructor(uuid?: TEntityId) {\r\n        this.uuid = uuid ?? Entity.uuidFn();\r\n        registerEntity(this);\r\n    }\r\n\r\n    get id(): TEntityId {\r\n        return this.uuid;\r\n    }\r\n\r\n    addComponent(component: Readonly<object> | TObjectProto, ...args: ReadonlyArray<unknown>): Entity {\r\n        const obj = this.asObject(component, ...args);\r\n\r\n        if (this.hasComponent(obj.constructor as typeof Object)) {\r\n            throw new Error(`Component \"${obj.constructor.name}\" already exists on entity!`)\r\n        }\r\n\r\n        this.components.set(obj.constructor as TObjectProto, obj);\r\n        return this;\r\n    }\r\n\r\n    addTag(tag: TTag): Entity {\r\n        this.tags.add(tag);\r\n        return this;\r\n    }\r\n\r\n    protected asObject(component: Readonly<object> | TObjectProto, ...args: ReadonlyArray<unknown>): object {\r\n        return typeof component === 'object'\r\n            ? component\r\n            : new (component.prototype.constructor.bind(component, ...Array.from(arguments).slice(1)))();\r\n    }\r\n\r\n    clone(serde: ISerDe, uuid?: TEntityId): Entity {\r\n        // serialize\r\n        const serialFormat = serde.serialize({\r\n            entities: [this].values(),\r\n            resources: {},\r\n        });\r\n\r\n        // de-serialize\r\n        const entity: Entity = serde.deserialize(serialFormat).entities.next().value;\r\n\r\n        // assign new ID\r\n        entity.uuid = uuid ?? Entity.uuidFn();\r\n\r\n        // DONE!\r\n        return entity;\r\n    }\r\n\r\n    getComponent<T extends object>(component: TTypeProto<T>): T | undefined {\r\n        return this.components.get(component) as T;\r\n    }\r\n\r\n    getComponentCount(): number {\r\n        return this.components.size;\r\n    }\r\n\r\n    getComponents(): IterableIterator<object> {\r\n        return this.components.values();\r\n    }\r\n\r\n    protected getConstructor(component: Readonly<object> | TObjectProto): Readonly<TObjectProto> {\r\n        return typeof component === 'object'\r\n            ? component.constructor as TObjectProto\r\n            : component;\r\n    }\r\n\r\n    getTagCount(): number {\r\n        return this.tags.size;\r\n    }\r\n\r\n    getTags(): IterableIterator<TTag> {\r\n        return this.tags.values();\r\n    }\r\n\r\n    hasComponent(component: typeof Object | TObjectProto): boolean {\r\n        return this.components.has(this.getConstructor(component));\r\n    }\r\n\r\n    hasTag(tag: TTag): boolean {\r\n        return this.tags.has(tag);\r\n    }\r\n\r\n    removeComponent(component: Readonly<object> | TObjectProto): Entity {\r\n        this.components.delete(this.getConstructor(component));\r\n        return this;\r\n    }\r\n\r\n    removeTag(tag: TTag): Entity {\r\n        this.tags.delete(tag);\r\n        return this;\r\n    }\r\n}\r\n", "import type {\r\n    IAccessDescriptor,\r\n    IExistenceDescriptor,\r\n    TAccessQueryParameter,\r\n    TOptionalAccessQueryParameter\r\n} from \"./query.spec\";\r\nimport {EAccess, EExistence, ETargetType} from \"./query.spec.ts\";\r\nimport type {TObjectProto, TTypeProto} from \"../_.spec.ts\";\r\nimport type {IEntity, TTag} from \"../entity/entity.spec.ts\";\r\nimport {Entity} from \"../entity/entity.ts\";\r\nimport {accessDescSym, existenceDescSym} from \"./_.ts\";\r\n\r\nexport function ReadEntity(uuid?: string): TAccessQueryParameter<TTypeProto<Readonly<IEntity>>> {\r\n    return Object.assign({}, Entity, {\r\n        [accessDescSym]: {\r\n            optional: false,\r\n            data: uuid,\r\n            target: Entity,\r\n            targetType: ETargetType.entity,\r\n            type: EAccess.meta,\r\n        },\r\n    } as IAccessDescriptor<Entity>);\r\n}\r\n\r\nexport function Read<C extends object>(componentPrototype: TTypeProto<C>): TAccessQueryParameter<TTypeProto<Readonly<C>>> {\r\n    return Object.assign({}, componentPrototype.prototype, {\r\n        [accessDescSym]: {\r\n            optional: false,\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EAccess.read,\r\n        },\r\n    } as IAccessDescriptor<C>);\r\n}\r\n\r\nexport function ReadOptional<C extends object>(componentPrototype: TTypeProto<C>): TOptionalAccessQueryParameter<TTypeProto<Readonly<C>>> {\r\n    return Object.assign({}, componentPrototype.prototype, {\r\n        [accessDescSym]: {\r\n            optional: true,\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EAccess.read,\r\n        },\r\n    } as IAccessDescriptor<C>);\r\n}\r\n\r\nexport function Write<C extends object>(componentPrototype: TTypeProto<C>): TAccessQueryParameter<TTypeProto<C>> {\r\n    return Object.assign({}, componentPrototype.prototype, {\r\n        [accessDescSym]: {\r\n            optional: false,\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EAccess.write,\r\n        },\r\n    } as IAccessDescriptor<C>);\r\n}\r\n\r\nexport function WriteOptional<C extends object>(componentPrototype: TTypeProto<C>): TOptionalAccessQueryParameter<TTypeProto<C>> {\r\n    return Object.assign({}, componentPrototype.prototype, {\r\n        [accessDescSym]: {\r\n            optional: true,\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EAccess.write,\r\n        },\r\n    } as IAccessDescriptor<C>);\r\n}\r\n\r\nexport function With<C extends object>(componentPrototype: TTypeProto<C>): IExistenceDescriptor<TTypeProto<C>> {\r\n    return {\r\n        [existenceDescSym]: {\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EExistence.set,\r\n        }\r\n    };\r\n}\r\n\r\nexport function WithTag(tag: TTag): TAccessQueryParameter<TObjectProto> & IExistenceDescriptor<TObjectProto> {\r\n    return {\r\n        [accessDescSym]: {\r\n            optional: false,\r\n            target: tag,\r\n            targetType: ETargetType.tag,\r\n            type: EAccess.meta,\r\n        },\r\n        [existenceDescSym]: {\r\n            target: tag,\r\n            targetType: ETargetType.tag,\r\n            type: EExistence.set,\r\n        }\r\n    } as TAccessQueryParameter<TObjectProto> & IExistenceDescriptor<TObjectProto>;\r\n}\r\n\r\nexport function Without<C extends object>(componentPrototype: TTypeProto<C>): IExistenceDescriptor<TTypeProto<C>> {\r\n    return {\r\n        [existenceDescSym]: {\r\n            target: componentPrototype,\r\n            targetType: ETargetType.component,\r\n            type: EExistence.unset,\r\n        }\r\n    };\r\n}\r\n\r\nexport function WithoutTag(tag: TTag): IExistenceDescriptor<TObjectProto> {\r\n    return {\r\n        [existenceDescSym]: {\r\n            target: tag,\r\n            targetType: ETargetType.tag,\r\n            type: EExistence.unset,\r\n        }\r\n    };\r\n}\r\n", "import {EQueryType, type IQuery} from \"./query.spec.ts\";\r\nimport type {IEntity} from \"../entity/entity.ts\";\r\nimport {addEntitySym, clearEntitiesSym, removeEntitySym, setEntitiesSym} from \"./_.ts\";\r\n\r\nexport * from \"./query.spec\";\r\nexport {\r\n    Read,\r\n    ReadEntity,\r\n    ReadOptional,\r\n    With,\r\n    WithTag,\r\n    Without,\r\n    Write,\r\n    WithoutTag,\r\n    WriteOptional,\r\n} from \"./query.util\";\r\n\r\n\r\nexport abstract class Query<DESC, DATA> implements IQuery<DESC, DATA> {\r\n    protected queryResult: Map<IEntity, DATA> = new Map();\r\n\r\n    constructor(\r\n        protected _queryType: EQueryType,\r\n        protected queryDescriptor: Readonly<DESC>,\r\n    ) {}\r\n\r\n    get descriptor(): Readonly<DESC> {\r\n        return this.queryDescriptor;\r\n    }\r\n\r\n    get queryType(): EQueryType {\r\n        return this._queryType;\r\n    }\r\n\r\n    get resultLength(): number {\r\n        return this.queryResult.size;\r\n    }\r\n\r\n    /** @internal */\r\n    abstract [addEntitySym](entity: Readonly<IEntity>): void;\r\n\r\n    /** @internal */\r\n    [clearEntitiesSym]() {\r\n        this.queryResult.clear();\r\n    }\r\n\r\n    /** @internal */\r\n    [removeEntitySym](entity: Readonly<IEntity>) {\r\n        this.queryResult.delete(entity)\r\n    }\r\n\r\n    /** @internal */\r\n    [setEntitiesSym](entities: IterableIterator<Readonly<IEntity>>) {\r\n        let entity;\r\n\r\n        this.queryResult.clear();\r\n\r\n        for (entity of entities) {\r\n            this[addEntitySym](entity);\r\n        }\r\n    }\r\n\r\n    async execute(handler: (data: DATA) => Promise<void> | void): Promise<void> {\r\n        let data: DATA;\r\n        for (data of this.queryResult.values()) {\r\n            await handler(data);\r\n        }\r\n    }\r\n\r\n    getFirst(): DATA | undefined {\r\n        return this.queryResult.values().next().value;\r\n    }\r\n\r\n    iter(): IterableIterator<DATA> {\r\n        return this.queryResult.values();\r\n    }\r\n\r\n    abstract matchesEntity(entity: Readonly<IEntity>): boolean;\r\n\r\n    toArray(): DATA[] {\r\n        return Array.from(this.queryResult.values());\r\n    }\r\n}\r\n", "import type {IEntitiesQuery, TExistenceQuery} from \"./query.spec.ts\";\r\nimport {EExistence, EQueryType, ETargetType} from \"./query.spec.ts\";\r\nimport {Query} from \"./query.ts\";\r\nimport type {IEntity, TTag} from \"../entity/entity.spec.ts\";\r\nimport {addEntitySym, existenceDescSym} from \"./_.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\n\r\nexport class EntitiesQuery extends Query<TExistenceQuery<TObjectProto>, IEntity> implements IEntitiesQuery {\r\n    constructor(\r\n        protected queryDesc: Readonly<TExistenceQuery<TObjectProto>>\r\n    ) {\r\n        super(EQueryType.Entities, queryDesc);\r\n    }\r\n\r\n    [addEntitySym](entity: Readonly<IEntity>): void {\r\n        if (this.matchesEntity(entity)) {\r\n            this.queryResult.set(entity, entity);\r\n        }\r\n    }\r\n\r\n    matchesEntity(entity: Readonly<IEntity>): boolean {\r\n        let componentDesc;\r\n\r\n        for (componentDesc of this.queryDescriptor) {\r\n            if (\r\n                componentDesc[existenceDescSym].targetType == ETargetType.tag\r\n                && entity.hasTag(componentDesc[existenceDescSym].target as TTag) != (componentDesc[existenceDescSym].type == EExistence.set)\r\n            ) {\r\n                return false;\r\n            }\r\n\r\n            if (\r\n                componentDesc[existenceDescSym].targetType == ETargetType.component\r\n                && entity.hasComponent(componentDesc[existenceDescSym].target as TObjectProto) != (componentDesc[existenceDescSym].type == EExistence.set)\r\n            ) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n", "import type {\r\n    IAccessDescriptor,\r\n    IAccessQuery,\r\n    IComponentsQuery,\r\n    TAccessQueryData,\r\n    TAccessQueryParameter,\r\n} from \"./query.spec\";\r\nimport {EQueryType, ETargetType} from \"./query.spec.ts\";\r\nimport {Query} from \"./query.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {IEntity, TTag} from \"../entity/entity.spec.ts\";\r\nimport {accessDescSym, addEntitySym} from \"./_.ts\";\r\n\r\nexport class ComponentsQuery<DESC extends IAccessQuery<TObjectProto>> extends Query<DESC, TAccessQueryData<DESC>> implements IComponentsQuery<DESC> {\r\n    constructor(\r\n        protected queryDescriptor: Readonly<DESC>,\r\n    ) {\r\n        super(EQueryType.Components, queryDescriptor);\r\n    }\r\n\r\n    [addEntitySym](entity: Readonly<IEntity>): void {\r\n        if (this.matchesEntity(entity)) {\r\n            this.queryResult.set(entity, this.getComponentDataFromEntity(entity, this.queryDescriptor));\r\n        }\r\n    }\r\n\r\n    protected getComponentDataFromEntity(entity: Readonly<IEntity>, descriptor: Readonly<DESC>): Readonly<TAccessQueryData<DESC>> {\r\n        const components: Record<string, Readonly<object>> = {};\r\n        let accessDesc;\r\n        let componentDesc: Readonly<TObjectProto | TAccessQueryParameter<TObjectProto>>;\r\n        let componentName: string;\r\n\r\n        for ([componentName, componentDesc] of Object.entries(descriptor)) {\r\n            accessDesc = (componentDesc as IAccessDescriptor<object>)[accessDescSym];\r\n\r\n            components[componentName] = accessDesc.targetType == ETargetType.component\r\n                ? (entity.getComponent(accessDesc.target as TObjectProto) ?? entity)\r\n                : entity;\r\n        }\r\n\r\n        return components as TAccessQueryData<DESC>;\r\n    }\r\n\r\n    matchesEntity(entity: Readonly<IEntity>): boolean {\r\n        let componentDesc: Readonly<IAccessDescriptor<TObjectProto | undefined>>;\r\n\r\n        // @ts-ignore todo: figure out typing. Something is still wrong somewhere\r\n        for (componentDesc of Object.values(this.queryDescriptor)) {\r\n            if (\r\n                componentDesc[accessDescSym].targetType == ETargetType.tag\r\n                && !entity.hasTag(componentDesc[accessDescSym].target as TTag)\r\n            ) {\r\n                return false;\r\n            }\r\n\r\n            if (\r\n                componentDesc[accessDescSym].targetType == ETargetType.component\r\n                && !entity.hasComponent(componentDesc[accessDescSym].target as TObjectProto)\r\n            ) {\r\n                if (componentDesc[accessDescSym].optional) {\r\n                    continue;\r\n                }\r\n\r\n                return false;\r\n            }\r\n\r\n            if (\r\n                componentDesc[accessDescSym].targetType == ETargetType.entity\r\n                && componentDesc[accessDescSym].data !== undefined\r\n                && componentDesc[accessDescSym].data != entity.id\r\n            ) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n", "import type {IAccessQuery, IComponentsQuery, IEntitiesQuery, TExistenceQuery} from \"../query/query.spec.ts\";\r\nimport {EntitiesQuery} from \"../query/entities-query.ts\";\r\nimport {ComponentsQuery} from \"../query/components-query.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\n\r\nexport function queryComponents<DESC extends IAccessQuery<TObjectProto>>(query: Readonly<DESC>): IComponentsQuery<DESC> {\r\n    return new ComponentsQuery(query);\r\n}\r\n\r\nexport function queryEntities(...query: Readonly<TExistenceQuery<TObjectProto>>): IEntitiesQuery {\r\n    return new EntitiesQuery(query);\r\n}\r\n", "import type {ISyncPoint} from \"../scheduler/pipeline/sync-point.spec.ts\";\r\n\r\nconst syncPoints = new Map<string, ISyncPoint>();\r\n\r\n/**\r\n * Register a sync-point by name\r\n * @param syncPoint\r\n */\r\nexport function addSyncPoint(syncPoint: Readonly<ISyncPoint>): void {\r\n    if (!syncPoint.name) {\r\n        throw new Error('Cannot register a sync point without a name!');\r\n    }\r\n\r\n    {\r\n        const name = syncPoint.name;\r\n\r\n        if (syncPoints.has(name) && syncPoints.get(name) != syncPoint) {\r\n            throw new Error(`Another sync point with the name \"${name}\" has already been registered!`);\r\n        }\r\n\r\n        syncPoints.set(name, syncPoint);\r\n    }\r\n}\r\n\r\n/**\r\n * Find a sync-point by name, if it exists\r\n * @param name\r\n */\r\nexport function getSyncPoint(name: string): ISyncPoint | undefined {\r\n    return syncPoints.get(name);\r\n}\r\n\r\n/**\r\n * Remove a sync-point from the registry by name, if it exists\r\n * @param name\r\n */\r\nexport function removeSyncPoint(name: string): void {\r\n    syncPoints.delete(name);\r\n}\r\n", "import type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {IDeserializerOutput} from \"../serde/serde.spec.ts\";\r\n\r\n// todo: read the Constructor parameters in order to throw early if a field is missing\r\nexport function dataStructDeserializer(Constructor: TObjectProto, data: unknown): IDeserializerOutput {\r\n    if (typeof data != 'object') {\r\n        throw new Error(`Cannot default-deserialize ${Constructor.name}, because the data is of type ${typeof data}!`);\r\n    }\r\n\r\n    const obj: { [key: string]: any } = new Constructor();\r\n\r\n    for (const kv of Object.entries(data as object)) {\r\n        obj[kv[0]] = kv[1];\r\n    }\r\n\r\n    return {\r\n        containsRefs: false,\r\n        data: obj,\r\n        type: Constructor,\r\n    };\r\n}\r\n\r\nexport function dataStructSerializer(component: unknown): unknown {\r\n    return component;\r\n}\r\n", "export const systemEventReaderSym = Symbol();\nexport const systemEventWriterSym = Symbol();\nexport const systemResourceTypeSym = Symbol();\nexport const systemRunParamSym = Symbol();\n", "import type {ISystemError} from \"./error.spec.ts\";\r\nimport type {TTypeProto} from \"../_.spec.ts\";\r\nimport type {ISystem} from \"../system/system.spec.ts\";\r\n\r\nexport class SystemError implements ISystemError {\r\n    constructor(\r\n        protected _cause: Readonly<Error>,\r\n        protected _System: Readonly<TTypeProto<ISystem>>\r\n    ) {}\r\n\r\n    get cause(): Error {\r\n        return this._cause;\r\n    }\r\n\r\n    get System(): Readonly<TTypeProto<ISystem>> {\r\n        return this._System;\r\n    }\r\n}\r\n", "import type {IStage, TStageSchedulingAlgorithm} from \"./stage.spec.ts\";\r\nimport type {ISystem} from \"../../system/system.spec.ts\";\r\nimport type {TExecutor, TTypeProto} from \"../../_.spec.ts\";\r\nimport {systemRunParamSym} from \"../../system/_.ts\";\r\nimport {SystemError} from \"../../world/error.ts\";\r\nimport type {IEventBus} from \"../../events/event-bus.spec.ts\";\r\n\r\nexport * from \"./stage.spec\";\r\n\r\nexport async function defaultStageSchedulingAlgorithm(systems: ReadonlyArray<Readonly<ISystem>>, eventBus: Readonly<IEventBus>): Promise<void> {\r\n    let system;\r\n\r\n    try {\r\n        for (system of systems) {\r\n            // todo: check WRITE constraints to speed it up...\r\n            await system.runFunction.call(system, system[systemRunParamSym]!);\r\n        }\r\n    } catch (error) {\r\n        if (error instanceof Error && !!system) {\r\n            await eventBus.publish(new SystemError(error, system.constructor as TTypeProto<ISystem>));\r\n        } else {\r\n            throw error;\r\n        }\r\n    }\r\n}\r\n\r\nexport class Stage implements IStage {\r\n    public schedulingAlgorithm: TStageSchedulingAlgorithm = defaultStageSchedulingAlgorithm;\r\n    public systems: Array<ISystem> = [];\r\n\r\n    addSystem(System: Readonly<ISystem>): Stage {\r\n        this.systems.push(System);\r\n        return this;\r\n    }\r\n\r\n    getExecutor(eventBus: Readonly<IEventBus>): TExecutor {\r\n        return this.schedulingAlgorithm.bind(this, this.systems, eventBus);\r\n    }\r\n}\r\n", "import type {ISyncPoint, ISyncPointPrefab} from \"./sync-point.spec.ts\";\r\nimport {type IStage, Stage} from \"./stage.ts\";\r\nimport type {ISystem} from \"../../system/system.spec.ts\";\r\n\r\nexport * from \"./sync-point.spec\";\r\n\r\nexport class SyncPoint implements ISyncPoint {\r\n    public after?: ISyncPoint;\r\n    public before?: ISyncPoint;\r\n    public name?: string\r\n    public stages: Array<IStage> = [];\r\n    protected syncPointHandlers = new Set<Function>();\r\n\r\n\r\n\r\n    addNewStage(handler: (stage: IStage) => void): SyncPoint {\r\n        const stage = new Stage();\r\n        this.stages.push(stage);\r\n        handler(stage);\r\n        return this;\r\n    }\r\n\r\n    addOnSyncHandler(handler: Function): SyncPoint {\r\n        this.syncPointHandlers.add(handler);\r\n        return this;\r\n    }\r\n\r\n    clearOnSyncHandlers(): ISyncPoint {\r\n        this.syncPointHandlers.clear();\r\n        return this;\r\n    }\r\n\r\n    async executeOnSyncHandlers(): Promise<SyncPoint> {\r\n        let handler;\r\n\r\n        for (handler of this.syncPointHandlers) {\r\n            await handler();\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    fromPrefab({after, before, stages = []}: Readonly<ISyncPointPrefab>): SyncPoint {\r\n        this.after = after\r\n            ? new SyncPoint().fromPrefab(after)\r\n            : undefined;\r\n        this.before = before\r\n            ? new SyncPoint().fromPrefab(before)\r\n            : undefined;\r\n        this.stages.length = 0;\r\n\r\n        {\r\n            let stage: ISystem[];\r\n            let system: ISystem;\r\n            for (stage of stages) {\r\n                this.addNewStage(newStage => {\r\n                    for (system of stage) {\r\n                        newStage.addSystem(system);\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    removeOnSyncHandler(handler: Function): SyncPoint {\r\n        this.syncPointHandlers.delete(handler);\r\n        return this;\r\n    }\r\n}\r\n", "import type {IPipeline} from \"./pipeline.spec.ts\";\r\nimport {type ISyncPoint, SyncPoint} from \"./sync-point.ts\";\r\n\r\nexport * from \"./pipeline.spec\";\r\n\r\nexport class Pipeline implements IPipeline {\r\n    protected _root: ISyncPoint = new SyncPoint();\r\n\r\n    get root(): Readonly<ISyncPoint> {\r\n        return this._root;\r\n    }\r\n\r\n    getGroups(): ReadonlyArray<Readonly<ISyncPoint>> {\r\n        const orderedPoints: ISyncPoint[] = [];\r\n        const traversePoint = (point: Readonly<ISyncPoint>) => {\r\n            point.before && traversePoint(point.before);\r\n            orderedPoints.push(point);\r\n            point.after && traversePoint(point.after);\r\n        };\r\n\r\n        traversePoint(this._root);\r\n        return orderedPoints;\r\n    }\r\n}\r\n", "import type {IAccessQuery, IComponentsQuery, IEntitiesQuery} from \"../query/query.spec.ts\";\r\nimport type {TObjectProto, TTypeProto} from \"../_.spec.ts\";\r\nimport type {ISystemActions} from \"../world/actions.spec.ts\";\r\nimport {systemEventReaderSym, systemEventWriterSym, systemResourceTypeSym, systemRunParamSym} from \"./_.ts\";\r\nimport type {IEventReader} from \"../events/event-reader.spec.ts\";\r\nimport type {IEventWriter} from \"../events/event-writer.spec.ts\";\r\n\r\nexport type TSystemParameter =\r\n    IEntitiesQuery\r\n    | IEventReader<TObjectProto>\r\n    | IComponentsQuery<IAccessQuery<TObjectProto>>\r\n    | ISystemActions\r\n    | ISystemResource<TObjectProto>\r\n    | ISystemStorage;\r\nexport type TSystemParameterDesc = { [name: string]: TSystemParameter };\r\nexport type TSystemFunction<PDESC extends TSystemParameterDesc> = (params: Readonly<PDESC>) => void | Promise<void>;\r\n\r\nexport interface ISystem<PDESC extends TSystemParameterDesc = TSystemParameterDesc> {\r\n    /** @internal */\r\n    [systemRunParamSym]?: Readonly<PDESC>\r\n    readonly name: string\r\n    readonly parameterDesc: Readonly<PDESC>\r\n    readonly runFunction: TSystemFunction<Readonly<PDESC>>\r\n    readonly setupFunction: TSystemFunction<Readonly<PDESC>>\r\n}\r\n\r\nexport interface ISystemResource<T extends object> {\r\n    /** @internal */\r\n    [systemResourceTypeSym]: TTypeProto<T>\r\n}\r\n\r\ninterface ISystemStorage {}\r\n\r\nexport const Actions: ISystemActions = { [Symbol()]: undefined } as unknown as Readonly<ISystemActions>;\r\n\r\nexport function ReadEvents<T extends TObjectProto>(type: T | ErrorConstructor): Readonly<IEventReader<T>> {\r\n    return {\r\n        [systemEventReaderSym]: type,\r\n    } as unknown as IEventReader<T>;\r\n}\r\n\r\nexport function ReadResource<T extends object>(type: TTypeProto<T>): ISystemResource<T> & T {\r\n    return {\r\n        [systemResourceTypeSym]: type,\r\n    } as ISystemResource<T> & Readonly<T>;\r\n}\r\n\r\nexport function Storage<T>(initializer: T): ISystemStorage & T {\r\n    return initializer as ISystemStorage & T;\r\n}\r\n\r\nexport function WriteEvents<T extends TObjectProto>(type: T): Readonly<IEventWriter<T>> {\r\n    return {\r\n        [systemEventWriterSym]: type,\r\n    } as unknown as IEventWriter<T>;\r\n}\r\n\r\nexport function WriteResource<T extends object>(type: TTypeProto<T>): ISystemResource<T> & T {\r\n    return {\r\n        [systemResourceTypeSym]: type,\r\n    } as ISystemResource<T> & T;\r\n}\r\n", "import type {ISystemBuilder} from \"./system-builder.spec.ts\";\r\nimport type {ISystem, TSystemFunction, TSystemParameterDesc} from \"./system.spec.ts\";\r\n\r\nexport * from \"./system-builder.spec\";\r\n\r\nexport class SystemBuilder<PARAMDESC extends TSystemParameterDesc> implements ISystemBuilder<Readonly<PARAMDESC>> {\r\n    systemName: string = '';\r\n    parameterDesc: Readonly<PARAMDESC>;\r\n    setupFunction: TSystemFunction<Readonly<PARAMDESC>> = () => {};\r\n    runFunction: TSystemFunction<Readonly<PARAMDESC>> = () => {};\r\n\r\n\r\n    constructor(params: Readonly<PARAMDESC>) {\r\n        this.parameterDesc = params;\r\n    }\r\n\r\n    build(): ISystem<Readonly<PARAMDESC>> {\r\n        const self = this;\r\n        const System = class implements Readonly<ISystem<Readonly<PARAMDESC>>> {\r\n            readonly name = self.systemName;\r\n            readonly parameterDesc = self.parameterDesc;\r\n            readonly runFunction = self.runFunction;\r\n            readonly setupFunction = self.setupFunction;\r\n        };\r\n\r\n        Object.defineProperty(System, 'name', {\r\n            configurable: true,\r\n            writable: false,\r\n            enumerable: false,\r\n            value: this.systemName,\r\n        });\r\n\r\n        return new System();\r\n    }\r\n\r\n    name(name: string): SystemBuilder<Readonly<PARAMDESC>> {\r\n        return this.withName(name);\r\n    }\r\n\r\n    run(fn: TSystemFunction<Readonly<PARAMDESC>>): SystemBuilder<Readonly<PARAMDESC>> {\r\n        return this.withRunFunction(fn);\r\n    }\r\n\r\n    setup(fn: TSystemFunction<Readonly<PARAMDESC>>): SystemBuilder<Readonly<PARAMDESC>> {\r\n        return this.withSetupFunction(fn);\r\n    }\r\n\r\n    withName(name: string): SystemBuilder<Readonly<PARAMDESC>> {\r\n        this.systemName = name;\r\n        return this;\r\n    }\r\n\r\n    withRunFunction(fn: TSystemFunction<Readonly<PARAMDESC>>): SystemBuilder<Readonly<PARAMDESC>> {\r\n        this.runFunction = fn;\r\n        return this;\r\n    }\r\n\r\n    withSetupFunction(fn: TSystemFunction<Readonly<PARAMDESC>>): SystemBuilder<Readonly<PARAMDESC>> {\r\n        this.setupFunction = fn;\r\n        return this;\r\n    }\r\n}\r\n\r\n// Change alias refs for better performance\r\n\r\nSystemBuilder.prototype.name = SystemBuilder.prototype.withName;\r\nSystemBuilder.prototype.run = SystemBuilder.prototype.withRunFunction;\r\nSystemBuilder.prototype.setup = SystemBuilder.prototype.withSetupFunction;\r\n", "import type {ISystem} from \"../system/system.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {IIStateProto} from \"../state/state.spec.ts\";\r\n\r\n\r\nclass SimECSPDAEvent {\r\n    constructor(\r\n        public readonly state: Readonly<IIStateProto>\r\n    ) {}\r\n}\r\n\r\nexport class SimECSPDAPushStateEvent extends SimECSPDAEvent {}\r\n\r\n\r\nclass SimECSResourceEvent<T extends TObjectProto> {\r\n    constructor(\r\n        public resourceType: T,\r\n        public resourceObject: InstanceType<T>,\r\n    ) {}\r\n}\r\n\r\nexport class SimECSAddResourceEvent<T extends TObjectProto> extends SimECSResourceEvent<T> {}\r\nexport class SimECSReplaceResourceEvent<T extends TObjectProto> extends SimECSResourceEvent<T> {}\r\n\r\n\r\nclass SimECSSystemResourceEvent {\r\n    constructor(\r\n        public readonly system: Readonly<ISystem>,\r\n        public readonly paramName: string,\r\n        public readonly resource: Readonly<TObjectProto>,\r\n    ) {}\r\n}\r\n\r\nexport class SimECSSystemAddResource extends SimECSSystemResourceEvent {}\r\nexport class SimECSSystemReplaceResource extends SimECSSystemResourceEvent {}\r\n", "import type {\r\n    ISystem,\r\n    ISystemResource,\r\n    TSystemParameter,\r\n    TSystemParameterDesc,\r\n} from \"./system.spec\";\r\nimport {Actions, Storage} from \"./system.spec.ts\";\r\nimport {SystemBuilder} from \"./system-builder.ts\";\r\nimport {Query} from \"../query/query.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport {systemEventReaderSym, systemEventWriterSym, systemResourceTypeSym} from \"./_.ts\";\r\nimport type {ISystemBuilder} from \"./system-builder.spec.ts\";\r\nimport {type IRuntimeWorld} from \"../world/runtime/runtime-world.ts\";\r\nimport {SimECSSystemAddResource} from \"../events/internal-events.ts\";\r\n\r\n\r\nexport * from \"./system.spec\";\r\n\r\nexport function createSystem<T extends TSystemParameterDesc>(parameterDesc: Readonly<T>): ISystemBuilder<T> {\r\n    return new SystemBuilder(parameterDesc);\r\n}\r\n\r\nexport function getQueriesFromSystem(system: Readonly<ISystem>): Array<Readonly<Query<unknown, unknown>>> {\r\n    const queries: Query<unknown, unknown>[] = [];\r\n    let param: TSystemParameter;\r\n\r\n    for (param of Object.values(system.parameterDesc)) {\r\n        if (param instanceof Query) {\r\n            queries.push(param);\r\n        }\r\n    }\r\n\r\n    return queries;\r\n}\r\n\r\nexport function getSystemRunParameters(system: Readonly<ISystem>, world: Readonly<IRuntimeWorld>): TSystemParameterDesc {\r\n    let runParameters = {};\r\n\r\n    for (const [paramName, paramDesc] of Object.entries(system.parameterDesc)) {\r\n        if (paramDesc == Actions) {\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: false,\r\n                value: world.systemActions,\r\n            });\r\n        } else if (paramDesc == Storage) {\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: false,\r\n                value: paramDesc,\r\n            });\r\n        } else if (Object.getOwnPropertySymbols(paramDesc).includes(systemResourceTypeSym)) {\r\n            const resourceType = (paramDesc as ISystemResource<TObjectProto>)[systemResourceTypeSym];\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: true,\r\n                value: world.getResource(resourceType),\r\n            });\r\n\r\n            world.eventBus.publish(new SimECSSystemAddResource(\r\n                system,\r\n                paramName,\r\n                resourceType,\r\n            ));\r\n        } else if (Object.getOwnPropertySymbols(paramDesc).includes(systemEventReaderSym)) {\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: false,\r\n                value: world.eventBus.createReader((paramDesc as any)[systemEventReaderSym]),\r\n            });\r\n        } else if (Object.getOwnPropertySymbols(paramDesc).includes(systemEventWriterSym)) {\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: false,\r\n                value: world.eventBus.createWriter(),\r\n            });\r\n        } else {\r\n            Object.defineProperty(runParameters, paramName, {\r\n                configurable: false,\r\n                enumerable: true,\r\n                writable: false,\r\n                value: paramDesc,\r\n            });\r\n        }\r\n    }\r\n\r\n    return runParameters;\r\n}\r\n", "import type {IScheduler} from \"./scheduler.spec.ts\";\r\nimport {type IPipeline, Pipeline} from \"./pipeline/pipeline.ts\";\r\nimport type {TExecutor} from \"../_.spec.ts\";\r\nimport {systemRunParamSym} from \"../system/_.ts\";\r\nimport {getSystemRunParameters, ISystem} from \"../system/system.ts\";\r\nimport type {IRuntimeWorld} from \"../world/runtime/runtime-world.spec.ts\";\r\nimport {IEventBus} from \"../events/event-bus.spec.ts\";\r\n\r\nexport * from \"./scheduler.spec\";\r\n\r\n\r\nexport async function defaultSchedulingAlgorithm(stageExecutors: ReadonlyArray<TExecutor>) {\r\n    let stageExecutor;\r\n    for (stageExecutor of stageExecutors) {\r\n        await stageExecutor();\r\n    }\r\n}\r\n\r\nexport class Scheduler implements IScheduler {\r\n    #isPrepared = false;\r\n    #pipeline: IPipeline = new Pipeline();\r\n    schedulingAlgorithm = defaultSchedulingAlgorithm;\r\n\r\n    get isPrepared(): boolean {\r\n        return this.#isPrepared;\r\n    }\r\n\r\n    get pipeline(): IPipeline {\r\n        return this.#pipeline;\r\n    }\r\n\r\n    set pipeline(newPipeline: Readonly<IPipeline>) {\r\n        if (this.#isPrepared) {\r\n            throw new Error('This scheduler was already prepared or is executing and cannot be changed right now!');\r\n        }\r\n\r\n        this.#pipeline = newPipeline;\r\n    }\r\n\r\n    getExecutor(eventBus: Readonly<IEventBus>): TExecutor {\r\n        const stageExecutors: TExecutor[] = [];\r\n\r\n        for (const group of this.#pipeline.getGroups()) {\r\n            for (const stage of group.stages) {\r\n                stageExecutors.push(stage.getExecutor(eventBus));\r\n            }\r\n\r\n            stageExecutors.push(group.executeOnSyncHandlers.bind(group) as () => Promise<any>);\r\n        }\r\n\r\n        return this.schedulingAlgorithm.bind(this, stageExecutors);\r\n    }\r\n\r\n    getSystems(): ReadonlySet<ISystem> {\r\n        const systems = new Set<ISystem>();\r\n        let group, stage, system;\r\n\r\n        for (group of this.pipeline.getGroups()) {\r\n            for (stage of group.stages) {\r\n                for (system of stage.systems) {\r\n                    systems.add(system);\r\n                }\r\n            }\r\n        }\r\n\r\n        return systems;\r\n    }\r\n\r\n    async prepare(world: Readonly<IRuntimeWorld>): Promise<void> {\r\n        let stage;\r\n        let syncPoint;\r\n        let system;\r\n\r\n        this.#isPrepared = false;\r\n\r\n        for (syncPoint of this.pipeline.getGroups().values()) {\r\n            for (stage of syncPoint.stages) {\r\n                for (system of stage.systems) {\r\n                    system[systemRunParamSym] = getSystemRunParameters(system, world);\r\n                    await system.setupFunction.call(system, system[systemRunParamSym]!);\r\n                }\r\n            }\r\n        }\r\n\r\n        this.#isPrepared = true;\r\n    }\r\n}\r\n", "import type {IEntity} from \"../entity/entity.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {ISerialFormat} from \"./serial-format.spec.ts\";\r\nimport type {IEntitiesQuery} from \"../query/query.spec.ts\";\r\n\r\n/// stores the constructor name and the data blob on indices 0 and 1 accordingly\r\nexport type TCustomDeserializer = (data: unknown) => IDeserializerOutput;\r\nexport type TDeserializer = (constructorName: string, data: unknown) => IDeserializerOutput;\r\nexport type TSerializable = unknown;\r\nexport type TSerializer = (component: unknown) => TSerializable;\r\n\r\n\r\nexport interface ISerDeOptions<T extends TSerializer | TDeserializer> {\r\n    entities?: Readonly<IEntitiesQuery>\r\n    fallbackHandler?: T\r\n    /**\r\n     * Replace resources in the world with loaded data\r\n     * @default true\r\n     */\r\n    replaceResources?: boolean\r\n    resources?: ReadonlyArray<TObjectProto>\r\n    useDefaultHandler?: boolean\r\n    useRegisteredHandlers?: boolean\r\n}\r\n\r\nexport interface IDeserializerOutput {\r\n    containsRefs: boolean\r\n    data: object\r\n    type: Readonly<TObjectProto>\r\n}\r\n\r\nexport interface ISerDeDataSet {\r\n    entities: IterableIterator<Readonly<IEntity>>\r\n    resources: Readonly<Record<string, Readonly<object>>>\r\n}\r\n\r\nexport interface ISerDeOperations {\r\n    deserializer: TCustomDeserializer\r\n    serializer: TSerializer\r\n}\r\n\r\nexport interface ISerDe {\r\n    /**\r\n     * Transform writable data to usable data objects\r\n     * @param data\r\n     * @param options\r\n     */\r\n    deserialize(data: Readonly<ISerialFormat>, options?: Readonly<ISerDeOptions<TDeserializer>>): ISerDeDataSet\r\n\r\n    /**\r\n     * Get an overview over all registered type handlers; useful for debugging\r\n     */\r\n    getRegisteredTypeHandlers(): IterableIterator<[string, Readonly<ISerDeOperations>]>\r\n\r\n    /**\r\n     * Register type handlers for transformations\r\n     * @param Type\r\n     * @param deserializer\r\n     * @param serializer\r\n     */\r\n    registerTypeHandler(Type: Readonly<TObjectProto>, deserializer: TCustomDeserializer, serializer: TSerializer): void\r\n\r\n    /**\r\n     * Transform data objects into writable data\r\n     * @param data\r\n     * @param options\r\n     */\r\n    serialize(data: Readonly<ISerDeDataSet>, options?: Readonly<ISerDeOptions<TSerializer>>): ISerialFormat\r\n\r\n    /**\r\n     * Remove a type handler registration\r\n     * @param Type\r\n     */\r\n    unregisterTypeHandler(Type: Readonly<TObjectProto>): void\r\n}\r\n\r\n\r\nexport const CIdMarker = '#ID' as const;\r\nexport const CMarkerSeparator = '|' as const;\r\nexport const CRefMarker = '*****' as const;\r\nexport const CResourceMarker = '#RES' as const;\r\nexport const CResourceMarkerValue = 1 as const;\r\nexport const CTagMarker = '#TAGS' as const;\r\n", "import type {ISerialFormat} from \"./serial-format.spec.ts\";\r\nimport type {TEntity} from \"./_.ts\";\r\n\r\nexport * from \"./serial-format.spec\";\r\n\r\nexport class SerialFormat extends Array<TEntity> implements ISerialFormat {\r\n    static fromArray(arr: ReadonlyArray<TEntity>): SerialFormat {\r\n        return new SerialFormat().fromArray(arr);\r\n    }\r\n\r\n    static fromJSON(json: string): SerialFormat {\r\n        return new SerialFormat().fromJSON(json);\r\n    }\r\n\r\n    fromArray(arr: ReadonlyArray<TEntity>): SerialFormat {\r\n        Object.assign(this, arr);\r\n        return this;\r\n    }\r\n\r\n    fromJSON(json: string): SerialFormat {\r\n        this.length = 0;\r\n\r\n        const newVals: Readonly<object> = JSON.parse(json);\r\n\r\n        if (!Array.isArray(newVals)) {\r\n            throw new Error('Input JSON must be an array!');\r\n        }\r\n\r\n        for (const entity of newVals) {\r\n            this.push(entity);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    toJSON(indentation?: string | number): string {\r\n        return JSON.stringify(Array.from(this), undefined, indentation);\r\n    }\r\n}\r\n", "export enum EReferenceType {\r\n    Entity = 'ENTITY',\r\n}\r\n\r\nexport interface IReference {\r\n    /**\r\n     * Id of the referenced object\r\n     */\r\n    readonly id: string\r\n    /**\r\n     * Type of the referenced object\r\n     */\r\n    readonly type: EReferenceType\r\n\r\n    /**\r\n     * Convert this reference to string.\r\n     * The string can later on be read to create a new Reference using the static method Reference.fromString()\r\n     */\r\n    toString(): string\r\n}\r\n", "import {EReferenceType, type IReference} from \"./referencing.spec.ts\";\r\nimport {CMarkerSeparator, CRefMarker} from \"./serde.spec.ts\";\r\n\r\nexport class Reference implements IReference {\r\n    constructor(\r\n        public readonly type: EReferenceType,\r\n        public readonly id: string,\r\n    ) {}\r\n\r\n    static fromString(refString: string): Readonly<Reference> | undefined {\r\n        const [marker, type, ...idTokens] = refString.split(CMarkerSeparator);\r\n\r\n        if (marker != CRefMarker) {\r\n            return undefined;\r\n        }\r\n\r\n        if (!(Object.values(EReferenceType) as string[]).includes(type)) {\r\n            return undefined;\r\n        }\r\n\r\n        return new Reference(type as EReferenceType, idTokens.join());\r\n    }\r\n\r\n    static isReferenceString (str: string): boolean {\r\n        const [marker, type] = str.split(CMarkerSeparator);\r\n        return marker === CRefMarker && (Object.values(EReferenceType) as string[]).includes(type);\r\n    }\r\n\r\n    toString(): string {\r\n        return `${CRefMarker}${CMarkerSeparator}${this.type}${CMarkerSeparator}${this.id}`;\r\n    }\r\n}\r\n", "import type {TDeserializer, TSerializer} from \"./serde.spec.ts\";\r\nimport {Entity} from \"../entity/entity.ts\";\r\nimport {Reference} from \"./referencing.ts\";\r\nimport {EReferenceType} from \"./referencing.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\n\r\n\r\nexport const getDefaultSerializer = function (customSerializer?: TSerializer): TSerializer {\r\n    return (component: unknown) => {\r\n        let componentName: string = typeof component;\r\n\r\n        switch (typeof component) {\r\n            case 'object': {\r\n                if (component == null) {\r\n                    return 'null';\r\n                }\r\n\r\n                componentName = component.constructor.name;\r\n\r\n                switch (componentName) {\r\n                    case 'Date':\r\n                        return (component as Date).getTime();\r\n                    case 'Array':\r\n                    case 'Object':\r\n                        return JSON.stringify(component, serializeObjectReplacer);\r\n                    case 'Map':\r\n                    case 'Set':\r\n                        return JSON.stringify(Array.from(component as Iterable<unknown>), serializeObjectReplacer);\r\n                }\r\n\r\n                break;\r\n            }\r\n\r\n            case \"string\": {\r\n                return JSON.stringify(component);\r\n            }\r\n        }\r\n\r\n        if (!customSerializer) {\r\n            throw new Error(`Missing serializer for \"${componentName}\"!`);\r\n        }\r\n\r\n        return customSerializer(component);\r\n    };\r\n}\r\n\r\nexport const getDefaultDeserializer = function (customDeserializer?: TDeserializer): TDeserializer {\r\n    return (constructorName: string, data: unknown) => {\r\n        switch (constructorName.toLowerCase()) {\r\n            case 'array': {\r\n                const inOut = {containsRefs: false};\r\n                const parsedData: ReadonlyArray<unknown> = JSON.parse(data as string, serializeObjectReviver.bind(undefined, inOut));\r\n\r\n                if (!Array.isArray(parsedData)) {\r\n                    throw new Error(`Cannot deserialize Array with data of type ${typeof data}! Array expected!`);\r\n                }\r\n\r\n                return {\r\n                    containsRefs: inOut.containsRefs,\r\n                    data: parsedData,\r\n                    type: Array as unknown as TObjectProto,\r\n                };\r\n            }\r\n\r\n            case 'date': {\r\n                if (typeof data != 'number') {\r\n                    throw new Error(`Cannot deserialize Date with data of type ${typeof data}! Number expected!`);\r\n                }\r\n\r\n                return {\r\n                    containsRefs: false,\r\n                    data: new Date(data),\r\n                    type: Date as unknown as TObjectProto,\r\n                };\r\n            }\r\n\r\n            case 'map': {\r\n                if (!Array.isArray(data)) {\r\n                    throw new Error(`Cannot deserialize Map with data of type ${typeof data}! Array of arrays expected!`);\r\n                }\r\n\r\n                const inOut = {containsRefs: false};\r\n\r\n                {\r\n                    let row;\r\n                    for (row of data) {\r\n                        row[1] = serializeObjectReviver(inOut, row[0], row[1]);\r\n                    }\r\n                }\r\n\r\n                return {\r\n                    containsRefs: inOut.containsRefs,\r\n                    data: new Map(data as [unknown, unknown][]),\r\n                    type: Map,\r\n                };\r\n            }\r\n\r\n            case 'object': {\r\n                const inOut = {containsRefs: false};\r\n                const parsedData: Readonly<object> = JSON.parse(data as string, serializeObjectReviver.bind(undefined, inOut));\r\n\r\n                if (typeof parsedData != 'object') {\r\n                    throw new Error(`Cannot deserialize Object with data of type ${typeof data}! Object expected!`);\r\n                }\r\n\r\n                return {\r\n                    containsRefs: inOut.containsRefs,\r\n                    data: parsedData,\r\n                    type: Object as unknown as TObjectProto,\r\n                };\r\n            }\r\n\r\n            case 'set': {\r\n                if (!Array.isArray(data)) {\r\n                    throw new Error(`Cannot deserialize Set with data of type ${typeof data}! Array expected!`);\r\n                }\r\n\r\n                const inOut = {containsRefs: false};\r\n\r\n                {\r\n                    const NO_KEY = '';\r\n                    for (let i = 0; i < data.length; i++) {\r\n                        data[i] = serializeObjectReviver(inOut, NO_KEY, data[i]);\r\n                    }\r\n                }\r\n\r\n                return {\r\n                    containsRefs: inOut.containsRefs,\r\n                    data: new Set(data as Array<unknown>),\r\n                    type: Set,\r\n                };\r\n            }\r\n        }\r\n\r\n        if (!customDeserializer) {\r\n            throw new Error(`Missing deserializer for \"${constructorName}\"!`);\r\n        }\r\n\r\n        return customDeserializer(constructorName, data);\r\n    }\r\n};\r\n\r\nconst serializeObjectReplacer = function (key: string, value: Readonly<object>): string | object {\r\n    return value instanceof Entity\r\n        ? new Reference(EReferenceType.Entity, value.id).toString()\r\n        : value;\r\n};\r\n\r\nconst serializeObjectReviver = (inOut: {containsRefs: boolean} = {containsRefs: false}, key: string, value: any) => {\r\n    if (typeof value == 'string' && Reference.isReferenceString(value)) {\r\n        inOut.containsRefs = true;\r\n        return Reference.fromString(value);\r\n    }\r\n\r\n    return value;\r\n};\r\n", "import type {TObjectProto} from \"../_.spec.ts\";\r\nimport {\r\n    CIdMarker,\r\n    CResourceMarker,\r\n    CResourceMarkerValue,\r\n    CTagMarker,\r\n} from \"./serde.spec\";\r\nimport type {\r\n    IDeserializerOutput,\r\n    ISerDe,\r\n    ISerDeDataSet,\r\n    ISerDeOperations,\r\n    ISerDeOptions,\r\n    TCustomDeserializer,\r\n    TDeserializer,\r\n    TSerializer\r\n} from \"./serde.spec\";\r\nimport type {ISerialFormat} from \"./serial-format.spec.ts\";\r\nimport {SerialFormat} from \"./serial-format.ts\";\r\nimport type {IEntity, TEntityId, TTag} from \"../entity/entity.spec.ts\";\r\nimport {getDefaultDeserializer, getDefaultSerializer} from \"./default-handlers.ts\";\r\nimport {Entity} from \"../entity/entity.ts\";\r\nimport type {TEntity} from \"./_.ts\";\r\nimport {Reference} from \"./referencing.ts\";\r\nimport {EReferenceType} from \"./referencing.spec.ts\";\r\nimport {getEntity} from \"../ecs/ecs-entity.ts\";\r\n\r\nexport * from \"./serde.spec\";\r\n\r\nexport class SerDe implements ISerDe {\r\n    protected typeHandlers = new Map<string, Readonly<ISerDeOperations>>();\r\n\r\n    deserialize(data: Readonly<ISerialFormat>, options?: Readonly<ISerDeOptions<TDeserializer>>): ISerDeDataSet {\r\n        const finalOptions: typeof options = {\r\n            useDefaultHandler: options?.useDefaultHandler ?? true,\r\n            useRegisteredHandlers: options?.useRegisteredHandlers ?? true,\r\n            fallbackHandler: options?.fallbackHandler,\r\n        };\r\n        const entities: IEntity[] = [];\r\n        let resources: Record<string, Readonly<object>> = {};\r\n\r\n        {\r\n            const components = [];\r\n            const objectsWithRefs: Array<Readonly<object>> = [];\r\n            const tags: TTag[] = [];\r\n            let component;\r\n            let deserializerOut: IDeserializerOutput;\r\n            let id: TEntityId | undefined = undefined;\r\n            let serialComponentData: unknown;\r\n            let serialComponentName: string;\r\n            let serialEntity: TEntity;\r\n            let tag: TTag;\r\n\r\n            { // Resources are stored in the first TEntity\r\n                const serialResources = data.shift();\r\n\r\n                if (serialResources) {\r\n                    if (serialResources[CResourceMarker] !== CResourceMarkerValue) {\r\n                        data.unshift(serialResources);\r\n                    } else {\r\n                        delete serialResources[CResourceMarker];\r\n                        resources = Object.fromEntries(Array.from(Object.entries(serialResources))\r\n                            .map(([type, data]) => {\r\n                                if (finalOptions.useRegisteredHandlers && this.typeHandlers.has(type)) {\r\n                                    deserializerOut = this.typeHandlers.get(type)!.deserializer(data);\r\n                                } else if (finalOptions.useDefaultHandler) {\r\n                                    deserializerOut = getDefaultDeserializer(finalOptions.fallbackHandler)(type, data);\r\n                                } else {\r\n                                    throw new Error(`There is no deserializer for \"${type}\"!`);\r\n                                }\r\n\r\n                                if (deserializerOut.containsRefs) {\r\n                                    objectsWithRefs.push(deserializerOut.data);\r\n                                }\r\n\r\n                                return [type, data ? deserializerOut.data : deserializerOut.type];\r\n                            })\r\n                        );\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (serialEntity of data) {\r\n                for ([serialComponentName, serialComponentData] of Object.entries(serialEntity)) {\r\n                    if (finalOptions.useRegisteredHandlers && this.typeHandlers.has(serialComponentName)) {\r\n                        deserializerOut = this.typeHandlers.get(serialComponentName)!.deserializer(serialComponentData);\r\n                        components.push(deserializerOut.data);\r\n\r\n                        if (deserializerOut.containsRefs) {\r\n                            objectsWithRefs.push(deserializerOut.data);\r\n                        }\r\n                    } else if (serialComponentName == CIdMarker) {\r\n                        id = serialComponentData as string;\r\n                    } else if (serialComponentName == CTagMarker) {\r\n                        if (!Array.isArray(serialComponentData)) {\r\n                            throw new Error('Expected array of tags for the hash identifier!');\r\n                        }\r\n\r\n                        for (tag of serialComponentData) {\r\n                            if (!['string', 'number'].includes(typeof tag)) {\r\n                                throw new Error('Tags must be of type string or number!');\r\n                            }\r\n\r\n                            tags.push(tag);\r\n                        }\r\n                    } else if (finalOptions.useDefaultHandler) {\r\n                        deserializerOut = getDefaultDeserializer(finalOptions.fallbackHandler)(serialComponentName, serialComponentData);\r\n                        components.push(deserializerOut.data);\r\n\r\n                        if (deserializerOut.containsRefs) {\r\n                            objectsWithRefs.push(deserializerOut.data);\r\n                        }\r\n                    } else {\r\n                        throw new Error(`There is no deserializer for \"${serialComponentName}\"!`);\r\n                    }\r\n                }\r\n\r\n                {\r\n                    const entity = new Entity(id);\r\n\r\n                    for (tag of tags) {\r\n                        entity.addTag(tag);\r\n                    }\r\n\r\n                    for (component of components) {\r\n                        entity.addComponent(component);\r\n                    }\r\n\r\n                    entities.push(entity);\r\n                }\r\n\r\n                tags.length = 0;\r\n                components.length = 0;\r\n            }\r\n\r\n            {\r\n                let component: Record<string, any>;\r\n                for (component of objectsWithRefs) {\r\n                    dereferenceComponentRefs(component);\r\n                }\r\n            }\r\n        }\r\n\r\n        return {\r\n            entities: entities.values(),\r\n            resources,\r\n        };\r\n    }\r\n\r\n    getRegisteredTypeHandlers(): IterableIterator<[string, Readonly<ISerDeOperations>]> {\r\n        return this.typeHandlers.entries();\r\n    }\r\n\r\n    registerTypeHandler(Type: Readonly<TObjectProto>, deserializer: TCustomDeserializer, serializer: TSerializer): void {\r\n        if (this.typeHandlers.has(Type.name)) {\r\n            throw new Error(`The type \"${Type.name}\" was already registered!`);\r\n        }\r\n\r\n        this.typeHandlers.set(Type.name, {\r\n            deserializer,\r\n            serializer,\r\n        });\r\n    }\r\n\r\n    serialize(data: Readonly<ISerDeDataSet>, options?: Readonly<ISerDeOptions<TSerializer>>): SerialFormat {\r\n        const finalOptions: Readonly<typeof options> = {\r\n            useDefaultHandler: options?.useDefaultHandler ?? true,\r\n            useRegisteredHandlers: options?.useRegisteredHandlers ?? true,\r\n            fallbackHandler: options?.fallbackHandler,\r\n        };\r\n        const outData = new SerialFormat();\r\n\r\n        const serialize = (chunk: IterableIterator<object> | Array<object>, collector: Record<string, unknown>) => {\r\n            let item;\r\n            let serialData;\r\n\r\n            for (item of chunk) {\r\n                if (finalOptions.useRegisteredHandlers && this.typeHandlers.has(item.constructor.name)) {\r\n                    serialData = this.typeHandlers.get(item.constructor.name)!.serializer(item);\r\n                } else if (finalOptions.useDefaultHandler) {\r\n                    serialData = getDefaultSerializer(finalOptions.fallbackHandler)(item);\r\n                }\r\n\r\n                collector[item.constructor.name] = serialData;\r\n                serialData = undefined;\r\n            }\r\n        };\r\n\r\n        { // Resources are index 0!\r\n            const resources: Readonly<TEntity> = {\r\n                [CResourceMarker]: CResourceMarkerValue,\r\n            };\r\n\r\n            if (data.resources !== undefined) {\r\n                serialize(Object.values(data.resources), resources);\r\n            }\r\n\r\n            outData.push(resources);\r\n        }\r\n\r\n        {\r\n            let entity: IEntity;\r\n            let serialEntity: TEntity;\r\n\r\n            for (entity of data.entities) {\r\n                serialEntity = {\r\n                    [CIdMarker]: entity.id,\r\n                };\r\n\r\n                serialize(entity.getComponents(), serialEntity);\r\n\r\n                {\r\n                    const tags: TTag[] = Array.from(entity.getTags());\r\n\r\n                    if (tags.length > 0) {\r\n                        serialEntity[CTagMarker] = tags;\r\n                    }\r\n                }\r\n\r\n                outData.push(serialEntity);\r\n            }\r\n        }\r\n\r\n        return outData;\r\n    }\r\n\r\n    unregisterTypeHandler(Type: Readonly<TObjectProto>): void {\r\n        this.typeHandlers.delete(Type.name);\r\n    }\r\n}\r\n\r\nconst dereferenceComponentRefs = (component: /* mut */ Record<string, unknown>) => {\r\n    let key: string;\r\n    let value: unknown;\r\n\r\n    for ([key, value] of Object.entries(component)) {\r\n        if (value instanceof Reference) {\r\n            switch (value.type) {\r\n                case EReferenceType.Entity: {\r\n                    component[key] = getEntity(value.id);\r\n                    break;\r\n                }\r\n                default: {\r\n                    component[key] = value.id;\r\n                }\r\n            }\r\n        } else if (typeof value == 'object' && value !== null) {\r\n            dereferenceComponentRefs(value as Record<string, unknown>);\r\n        }\r\n    }\r\n};\r\n", "import {Entity, type TEntityId} from \"./entity.ts\";\r\nimport type {IEntityBuilder} from \"./entity-builder.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\n\r\nexport * from './entity-builder.spec';\r\n\r\nexport class EntityBuilder implements IEntityBuilder {\r\n    protected components = new Map<Readonly<object | TObjectProto>, ReadonlyArray<unknown>>();\r\n\r\n    constructor(\r\n        protected uuid?: TEntityId,\r\n        protected callback?: (entity: Entity) => void\r\n    ) {}\r\n\r\n    build(): Entity {\r\n        const entity = new Entity(this.uuid);\r\n        let component;\r\n\r\n        for (component of this.components) {\r\n            entity.addComponent(component[0], ...component[1]);\r\n        }\r\n\r\n        this.callback?.(entity);\r\n        return entity;\r\n    }\r\n\r\n    with(component: Readonly<object | TObjectProto>, ...args: ReadonlyArray<unknown>): EntityBuilder {\r\n        this.components.set(component, args);\r\n        return this;\r\n    }\r\n\r\n    withAll(...components: ReadonlyArray<object | TObjectProto>): EntityBuilder {\r\n        let component;\r\n        for (component of components) {\r\n            this.with(component);\r\n        }\r\n\r\n        return this;\r\n    }\r\n}\r\n", "import {type PreptimeWorld} from \"../preptime/preptime-world.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport type {IEntityBuilder} from \"../../entity/entity-builder.spec.ts\";\r\nimport type {IEntitiesQuery} from \"../../query/query.spec.ts\";\r\nimport {EntityBuilder} from \"../../entity/entity-builder.ts\";\r\nimport {Entity} from \"../../entity/entity.ts\";\r\nimport {type RuntimeWorld} from \"../runtime/runtime-world.ts\";\r\nimport type {IMutableWorld} from \"../world.spec.ts\";\r\n\r\n\r\nexport function buildEntity(this: IMutableWorld, uuid?: string): IEntityBuilder {\r\n    const self = this;\r\n    return new EntityBuilder(uuid, entity => self.addEntity(entity));\r\n}\r\n\r\nexport function clearEntities(this: IMutableWorld & (PreptimeWorld | RuntimeWorld)): void {\r\n    let entity;\r\n    for (entity of this.data.entities) {\r\n        this.removeEntity(entity);\r\n    }\r\n\r\n    this.clearGroups();\r\n}\r\n\r\nexport function createEntity(this: IMutableWorld): IEntity {\r\n    const entity = new Entity();\r\n    this.addEntity(entity);\r\n    return entity;\r\n}\r\n\r\nexport function getEntities(this: PreptimeWorld | RuntimeWorld, query?: Readonly<IEntitiesQuery>): IterableIterator<IEntity> {\r\n    if (!query) {\r\n        return this.data.entities.values();\r\n    }\r\n\r\n    return Array.from(this.data.entities.values())\r\n        .filter(entity => query.matchesEntity(entity))\r\n        .values();\r\n}\r\n", "import type {TObjectProto, TTypeProto} from \"../../_.spec.ts\";\r\nimport {type PreptimeWorld} from \"../preptime/preptime-world.ts\";\r\nimport {type RuntimeWorld} from \"../runtime/runtime-world.ts\";\r\nimport type {TExistenceQuery} from \"../../query/query.spec.ts\";\r\n\r\n\r\nexport function clearResources(this: PreptimeWorld | RuntimeWorld): void {\r\n    this.data.resources.clear();\r\n}\r\n\r\nexport function getResource<T extends object>(this: RuntimeWorld, type: TTypeProto<T>): T {\r\n    if (!this.data.resources.has(type)) {\r\n        throw new Error(`Resource of type \"${type.name}\" does not exist!`);\r\n    }\r\n\r\n    return this.data.resources.get(type) as T;\r\n}\r\n\r\nexport function *getResources(\r\n    this: PreptimeWorld | RuntimeWorld,\r\n    types?: Readonly<TExistenceQuery<any>>,\r\n): IterableIterator<object> {\r\n    if (!types) {\r\n        return this.data.resources.values();\r\n    }\r\n\r\n    const typesArray = Array.isArray(types)\r\n        ? types\r\n        : Array.from(types);\r\n\r\n    {\r\n        let resource;\r\n        let type;\r\n\r\n        for ([type, resource] of this.data.resources.entries()) {\r\n            if (typesArray.includes(type as TObjectProto)) {\r\n                yield resource;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport function hasResource<T extends object>(this: PreptimeWorld | RuntimeWorld, obj: Readonly<T> | TTypeProto<T>): boolean {\r\n    let type: TTypeProto<T>;\r\n\r\n    if (typeof obj === 'object') {\r\n        type = obj.constructor as TTypeProto<T>;\r\n    } else {\r\n        type = obj;\r\n    }\r\n\r\n    return this.data.resources.has(type);\r\n}\r\n\r\nexport function removeResource<T extends object>(this: PreptimeWorld | RuntimeWorld, type: TTypeProto<T>): void {\r\n    if (!this.data.resources.has(type)) {\r\n        throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n    }\r\n\r\n    this.data.resources.delete(type);\r\n}\r\n", "import type {TGroupHandle} from \"../world.spec.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport type {IPreptimeWorld} from \"../preptime/preptime-world.spec.ts\";\r\nimport {type PreptimeWorld} from \"../preptime/preptime-world.ts\";\r\nimport {type RuntimeWorld} from \"../runtime/runtime-world.ts\";\r\nimport type {IMutableWorld} from \"../world.spec.ts\";\r\n\r\n\r\nexport function addEntityToGroup(this: PreptimeWorld | RuntimeWorld, groupHandle: TGroupHandle, entity: Readonly<IEntity>): void {\r\n    this.addEntitiesToGroup(groupHandle, [entity]);\r\n}\r\n\r\nexport function addEntitiesToGroup(\r\n    this: PreptimeWorld | RuntimeWorld,\r\n    groupHandle: TGroupHandle,\r\n    entities: ReadonlyArray<Readonly<IEntity>> | IterableIterator<Readonly<IEntity>>,\r\n): void {\r\n    const link = getLink(this, groupHandle);\r\n    let entity;\r\n    for (entity of entities) {\r\n        link.add(entity);\r\n    }\r\n}\r\n\r\nexport function assimilateGroup(\r\n    this: PreptimeWorld | RuntimeWorld,\r\n    otherWorld: Readonly<IPreptimeWorld>,\r\n    handle: TGroupHandle,\r\n): TGroupHandle {\r\n    const entities = otherWorld.getGroupEntities(handle);\r\n    const newGroup = this.createGroup();\r\n\r\n    otherWorld.removeGroup(handle);\r\n    this.addEntitiesToGroup(newGroup, entities);\r\n\r\n    return newGroup;\r\n}\r\n\r\nexport function clearGroups(this: PreptimeWorld | RuntimeWorld): void {\r\n    this.data.groups.entityLinks.clear();\r\n    this.data.groups.nextHandle = 0;\r\n}\r\n\r\nexport function createGroup(this: PreptimeWorld | RuntimeWorld): TGroupHandle {\r\n    const handle = this.data.groups.nextHandle++;\r\n    this.data.groups.entityLinks.set(handle, new Set());\r\n    return handle;\r\n}\r\n\r\nexport function getGroupEntities(\r\n    this: PreptimeWorld | RuntimeWorld,\r\n    groupHandle: TGroupHandle,\r\n): IterableIterator<IEntity> {\r\n    return getLink(this, groupHandle).keys();\r\n}\r\n\r\nfunction getLink(world: PreptimeWorld | RuntimeWorld, groupHandle: TGroupHandle): Set<IEntity> {\r\n    const link = world.data.groups.entityLinks.get(groupHandle);\r\n\r\n    if (!link) {\r\n        throw new Error(`The group \"${groupHandle}\" does not exist in the world \"${world.name}\"`);\r\n    }\r\n\r\n    return link;\r\n}\r\n\r\nexport function removeGroup(this: IMutableWorld & (PreptimeWorld | RuntimeWorld), groupHandle: TGroupHandle): void {\r\n    const link = getLink(this, groupHandle);\r\n\r\n    let entity;\r\n    for (entity of link) {\r\n        this.removeEntity(entity);\r\n    }\r\n\r\n    this.data.groups.entityLinks.delete(groupHandle);\r\n}\r\n", "import {type PreptimeWorld} from \"./preptime-world.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\n\r\nexport function addEntity(this: PreptimeWorld, entity: Readonly<IEntity>): void {\r\n    this.data.entities.add(entity);\r\n}\r\n\r\nexport function hasEntity(this: PreptimeWorld, entity: Readonly<IEntity>): boolean {\r\n    return this.data.entities.has(entity);\r\n}\r\n\r\nexport function removeEntity(this: PreptimeWorld, entity: Readonly<IEntity>): void {\r\n    this.data.entities.delete(entity);\r\n}", "import type {TTypeProto} from \"../../_.spec.ts\";\r\nimport {type PreptimeWorld} from \"./preptime-world.ts\";\r\n\r\nexport function addResource<T extends object>(\r\n    this: PreptimeWorld,\r\n    Type: T | TTypeProto<T>,\r\n    ...args: ReadonlyArray<unknown>\r\n): T | TTypeProto<T> {\r\n    this.data.resources.set(Type, args);\r\n    return Type;\r\n}\r\n", "import type {ISerDeOptions, TSerializer} from \"../../serde/serde.spec.ts\";\r\nimport type {ISerialFormat} from \"../../serde/serial-format.spec.ts\";\r\nimport {type PreptimeWorld} from \"./preptime-world.ts\";\r\nimport type {TGroupHandle} from \"../world.spec.ts\";\r\nimport type {TDeserializer} from \"../../serde/serde.spec.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport type {TObjectProto} from \"../../_.spec.ts\";\r\n\r\nexport function load(\r\n    this: PreptimeWorld,\r\n    prefab: Readonly<ISerialFormat>,\r\n    options?: Readonly<ISerDeOptions<TDeserializer>>,\r\n    intoGroup?: TGroupHandle,\r\n): TGroupHandle {\r\n    let groupHandle = intoGroup;\r\n    if (groupHandle == undefined || !this.data.groups.entityLinks.has(groupHandle)) {\r\n        groupHandle = this.createGroup();\r\n    }\r\n\r\n    const serdeOut = this.config.serde.deserialize(prefab, options);\r\n\r\n    {\r\n        const entities = this.data.groups.entityLinks.get(groupHandle)!;\r\n        let entity: IEntity;\r\n\r\n        for (entity of serdeOut.entities) {\r\n            this.addEntity(entity);\r\n            entities.add(entity);\r\n        }\r\n    }\r\n\r\n    {\r\n        let resource: object | TObjectProto;\r\n        for (resource of Object.values(serdeOut.resources)) {\r\n            // @ts-ignore should work\r\n            this.addResource(resource);\r\n        }\r\n    }\r\n\r\n    return groupHandle;\r\n}\r\n\r\nexport function save(this: PreptimeWorld, options?: Readonly<ISerDeOptions<TSerializer>>): ISerialFormat {\r\n    const resources = Object.fromEntries(options?.resources?.map(type => [type.constructor.name]) ?? []);\r\n    return this.config.serde.serialize({\r\n        entities: this.getEntities(options?.entities),\r\n        resources,\r\n    }, options);\r\n}\r\n", "import type {TGroupHandle} from \"../world.spec.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport type {IPreptimeWorld} from \"../preptime/preptime-world.spec.ts\";\r\nimport {type PreptimeWorld} from \"../preptime/preptime-world.ts\";\r\nimport {type RuntimeWorld} from \"../runtime/runtime-world.ts\";\r\nimport type {IMutableWorld} from \"../world.spec.ts\";\r\n\r\nexport function merge(\r\n    this: IMutableWorld & (PreptimeWorld | RuntimeWorld),\r\n    elsewhere: Readonly<IPreptimeWorld>,\r\n    intoGroup?: TGroupHandle,\r\n): [TGroupHandle, Array<IEntity>] {\r\n    const groupHandle = intoGroup ?? this.data.groups.nextHandle++;\r\n    const entities = [];\r\n    let entity;\r\n\r\n    for (entity of elsewhere.getEntities()) {\r\n        elsewhere.removeEntity(entity);\r\n        this.addEntity(entity);\r\n        entities.push(entity);\r\n    }\r\n\r\n    return [groupHandle, entities];\r\n}\r\n", "import type {ISerDeOptions, TSerializer} from \"../../serde/serde.spec.ts\";\r\nimport type {ISerialFormat} from \"../../serde/serial-format.spec.ts\";\r\nimport {type RuntimeWorld} from \"./runtime-world.ts\";\r\nimport type {TGroupHandle} from \"../world.spec.ts\";\r\nimport type {TDeserializer} from \"../../serde/serde.spec.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport type {TObjectProto} from \"../../_.spec.ts\";\r\n\r\n\r\nexport function load(\r\n    this: RuntimeWorld,\r\n    prefab: Readonly<ISerialFormat>,\r\n    options?: Readonly<ISerDeOptions<TDeserializer>>,\r\n    intoGroup?: TGroupHandle,\r\n): TGroupHandle {\r\n    let groupHandle = intoGroup;\r\n    if (groupHandle == undefined || !this.data.groups.entityLinks.has(groupHandle)) {\r\n        groupHandle = this.createGroup();\r\n    }\r\n\r\n    const serdeOut = this.config.serde.deserialize(prefab, options);\r\n\r\n    {\r\n        const entities = this.data.groups.entityLinks.get(groupHandle)!;\r\n        let entity: IEntity;\r\n\r\n        for (entity of serdeOut.entities) {\r\n            this.addEntity(entity);\r\n            entities.add(entity);\r\n        }\r\n    }\r\n\r\n    {\r\n        let resource: object | TObjectProto;\r\n        for (resource of Object.values(serdeOut.resources)) {\r\n            if (this.hasResource(resource)) {\r\n                this.replaceResource(resource);\r\n            } else {\r\n                // @ts-ignore should work\r\n                this.addResource(resource);\r\n            }\r\n        }\r\n    }\r\n\r\n    return groupHandle;\r\n}\r\n\r\nexport function save(this: RuntimeWorld, options?: Readonly<ISerDeOptions<TSerializer>>): ISerialFormat {\r\n    const resources = Object.fromEntries(\r\n        options?.resources\r\n            ?.map(type => [type.constructor.name, (this as RuntimeWorld).getResource(type)!]) ?? []\r\n    );\r\n    return this.config.serde.serialize({\r\n        entities: this.getEntities(options?.entities),\r\n        resources,\r\n    }, options);\r\n}\r\n", "import {type RuntimeWorld} from \"./runtime-world.ts\";\r\nimport type {IEntity} from \"../../entity/entity.spec.ts\";\r\nimport {addEntitySym, removeEntitySym} from \"../../query/_.ts\";\r\n\r\nexport function addEntity(this: RuntimeWorld, entity: Readonly<IEntity>): void {\r\n    this.data.entities.add(entity);\r\n\r\n    {\r\n        let query;\r\n        for (query of this.queries) {\r\n            query[addEntitySym](entity);\r\n        }\r\n    }\r\n}\r\n\r\nexport function hasEntity(this: RuntimeWorld, entity: Readonly<IEntity>): boolean {\r\n    return this.data.entities.has(entity);\r\n}\r\n\r\nexport function removeEntity(this: RuntimeWorld, entity: Readonly<IEntity>): void {\r\n    this.data.entities.delete(entity);\r\n\r\n    {\r\n        let query;\r\n        for (query of this.queries) {\r\n            query[removeEntitySym](entity);\r\n        }\r\n    }\r\n}", "import {type RuntimeWorld} from \"./runtime-world.ts\";\r\nimport type {TTypeProto} from \"../../_.spec.ts\";\r\nimport {systemRunParamSym} from \"../../system/_.ts\";\r\nimport type {TSystemParameterDesc} from \"../../system/system.spec.ts\";\r\nimport {SimECSReplaceResourceEvent, SimECSSystemReplaceResource} from \"../../events/internal-events.ts\";\r\n\r\nexport function addResource<T extends object>(\r\n    this: RuntimeWorld,\r\n    obj: Readonly<T> | TTypeProto<T>,\r\n    ...args: ReadonlyArray<unknown>\r\n): T {\r\n    let type: TTypeProto<T>;\r\n    let instance: T;\r\n\r\n    if (typeof obj === 'object') {\r\n        type = obj.constructor as TTypeProto<T>;\r\n        instance = obj;\r\n    } else {\r\n        type = obj;\r\n        try {\r\n            instance = new (obj.prototype.constructor.bind(obj, ...Array.from(arguments).slice(1)))();\r\n        } catch (err: any) {\r\n            if (err instanceof TypeError && err.message.startsWith('Illegal constructor')) {\r\n                // @ts-ignore This may happen for some built-in constructors. They must be replaced later!\r\n                instance = null;\r\n            } else {\r\n                throw err;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (this.data.resources.has(type)) {\r\n        throw new Error(`Resource with name \"${type.name}\" already exists!`);\r\n    }\r\n\r\n    this.data.resources.set(type, instance);\r\n    return instance;\r\n}\r\n\r\nexport async function replaceResource<T extends object>(\r\n    this: RuntimeWorld,\r\n    obj: Readonly<T> | TTypeProto<T>,\r\n    ...args: ReadonlyArray<unknown>\r\n): Promise<void> {\r\n    let type: TTypeProto<T>;\r\n\r\n    if (typeof obj === 'object') {\r\n        type = obj.constructor as TTypeProto<T>;\r\n    } else {\r\n        type = obj;\r\n    }\r\n\r\n    if (!this.data.resources.has(type)) {\r\n        throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n    }\r\n\r\n    this.data.resources.delete(type);\r\n    const resourceObj = this.addResource(obj, ...args);\r\n\r\n    await this.eventBus.publish(new SimECSReplaceResourceEvent(\r\n        type,\r\n        resourceObj,\r\n    ));\r\n\r\n    { // Also replace the resources for all systems\r\n        let system, resourceDesc;\r\n        for ([system, resourceDesc] of this.systemResourceMap) {\r\n            if (resourceDesc.resourceType.name == type.name) {\r\n                (system[systemRunParamSym] as TSystemParameterDesc)[resourceDesc.paramName] = resourceObj;\r\n                await this.eventBus.publish(new SimECSSystemReplaceResource(\r\n                    system,\r\n                    resourceDesc.paramName,\r\n                    resourceDesc.resourceType,\r\n                ));\r\n            }\r\n        }\r\n    }\r\n}\r\n", "import type IPushDownAutomaton from \"./pda.spec.ts\";\r\nimport type {TTypeProto} from \"../_.spec.ts\";\r\n\r\nexport * from \"./pda.spec\";\r\n\r\ntype TStateNode<T> = {\r\n    state: T,\r\n    prevNode?: TStateNode<T>,\r\n};\r\n\r\nexport class PushDownAutomaton<T> implements IPushDownAutomaton<T> {\r\n    protected currentState?: T;\r\n    protected statesTail?: TStateNode<T>;\r\n\r\n    get state(): Readonly<T | undefined> {\r\n        return this.currentState;\r\n    }\r\n\r\n    clear(): void {\r\n        this.currentState = undefined;\r\n        this.statesTail = undefined;\r\n    }\r\n\r\n    pop(): T | undefined {\r\n        if (!this.statesTail) return;\r\n\r\n        const oldTail = this.statesTail;\r\n\r\n        this.statesTail = this.statesTail.prevNode;\r\n        this.currentState = this.statesTail?.state;\r\n\r\n        return oldTail.state;\r\n    }\r\n\r\n    push<P extends TTypeProto<T>>(State: P): void {\r\n        this.currentState = new State();\r\n        this.statesTail = {\r\n            prevNode: this.statesTail,\r\n            state: this.currentState,\r\n        };\r\n    }\r\n}\r\n", "import {PushDownAutomaton} from \"./pda.ts\";\r\nimport type {IRuntimeWorld} from \"../world/runtime/runtime-world.spec.ts\";\r\nimport type {TTypeProto} from \"../_.spec.ts\";\r\nimport {SimECSPDAPushStateEvent} from \"../events/internal-events.ts\";\r\nimport type {IState} from \"../state/state.spec.ts\";\r\n\r\nexport * from \"./pda\";\r\n\r\nexport class SimECSPushDownAutomaton<T extends IState> extends PushDownAutomaton<T> {\r\n    constructor(\r\n        protected world: IRuntimeWorld\r\n    ) {\r\n        super();\r\n    }\r\n\r\n    push<P extends TTypeProto<T>>(State: P): Promise<void> {\r\n        super.push(State);\r\n        return this.world.eventBus.publish(new SimECSPDAPushStateEvent(State));\r\n    }\r\n}\r\n", "import type {IEventReader} from \"./event-reader.spec.ts\";\r\nimport type {IEventBus} from \"./event-bus.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {TSubscriber} from \"./_.ts\";\r\n\r\nexport * from \"./event-reader.spec\";\r\n\r\nexport class EventReader<T extends TObjectProto> implements IEventReader<T> {\r\n    protected _eventHandler: TSubscriber<T> = event => { this.eventCache.push(event) };\r\n    protected eventCache: Array<Readonly<InstanceType<T>>> = [];\r\n\r\n    constructor(\r\n        protected bus: IEventBus,\r\n        protected _eventType: Readonly<T>,\r\n    ) {\r\n        bus.subscribe(_eventType, this._eventHandler);\r\n    }\r\n\r\n    get eventHandler(): TSubscriber<T> {\r\n        return this._eventHandler;\r\n    }\r\n\r\n    get eventType(): Readonly<T> {\r\n        return this._eventType;\r\n    }\r\n\r\n    async execute(handler: (event: Readonly<InstanceType<T>>) => (void | Promise<void>)): Promise<void> {\r\n        let event;\r\n        for (event of this.iter()) {\r\n            await handler(event);\r\n        }\r\n    }\r\n\r\n    getOne(): Readonly<InstanceType<T>> | undefined {\r\n        return this.eventCache.shift();\r\n    }\r\n\r\n    iter(): IterableIterator<Readonly<InstanceType<T>>> {\r\n        const events = Array.from(this.eventCache);\r\n        this.eventCache.length = 0;\r\n        return events.values();\r\n    }\r\n}\r\n", "import {type RuntimeWorld} from \"./runtime-world.ts\";\r\nimport type {IIStateProto} from \"../../state/state.spec.ts\";\r\nimport {State} from \"../../state/state.ts\";\r\nimport type {IScheduler} from \"../../scheduler/scheduler.spec.ts\";\r\nimport {EventReader} from \"../../events/event-reader.ts\";\r\nimport {EventBus} from \"../../events/event-bus.ts\";\r\n\r\nexport async function popState(this: RuntimeWorld): Promise<void> {\r\n    unsubscribeEventsOfSchedulerSystems(this.eventBus, this.currentScheduler!);\r\n    await this.pda.pop()?.deactivate(this.transitionWorld);\r\n\r\n    const newState = this.pda.state;\r\n    if (!newState) {\r\n        return;\r\n    }\r\n\r\n    await newState.activate(this.transitionWorld);\r\n    this.currentScheduler = this.config.stateSchedulers.get(newState.constructor as IIStateProto) ?? this.config.defaultScheduler;\r\n    this.currentSchedulerExecutor = this.currentScheduler.getExecutor(this.eventBus);\r\n    subscribeEventsOfSchedulerSystems(this.eventBus, this.currentScheduler);\r\n}\r\n\r\nexport async function pushState(this: RuntimeWorld, NewState: IIStateProto): Promise<void> {\r\n    if (this.currentScheduler) {\r\n        unsubscribeEventsOfSchedulerSystems(this.eventBus, this.currentScheduler);\r\n    }\r\n\r\n    await this.pda.state?.deactivate(this.transitionWorld);\r\n    await this.pda.push(NewState);\r\n\r\n    const newState = this.pda.state! as State;\r\n    await newState.create(this.transitionWorld);\r\n    await newState.activate(this.transitionWorld);\r\n    await this.commands.executeAll();\r\n    this.currentScheduler = this.config.stateSchedulers.get(NewState) ?? this.config.defaultScheduler;\r\n\r\n    if (!this.currentScheduler) {\r\n        throw new Error(`There is no DefaultScheduler or Scheduler for ${NewState.name}!`);\r\n    }\r\n\r\n    this.currentSchedulerExecutor = this.currentScheduler.getExecutor(this.eventBus);\r\n    subscribeEventsOfSchedulerSystems(this.eventBus, this.currentScheduler);\r\n}\r\n\r\nexport function subscribeEventsOfSchedulerSystems(eventBus: EventBus, scheduler: IScheduler) {\r\n    const systems = scheduler.pipeline.getGroups().map(g => g.stages).flat().map(s => s.systems).flat();\r\n    let system;\r\n    let systemParam;\r\n\r\n    for (system of systems) {\r\n        for (systemParam of Object.values(system.parameterDesc)) {\r\n            if (systemParam instanceof EventReader) {\r\n                eventBus.subscribeReader(systemParam);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport function unsubscribeEventsOfSchedulerSystems(eventBus: EventBus, scheduler: IScheduler) {\r\n    const systems = scheduler.pipeline.getGroups().map(g => g.stages).flat().map(s => s.systems).flat();\r\n    let system;\r\n    let systemParam;\r\n\r\n    for (system of systems) {\r\n        for (systemParam of Object.values(system.parameterDesc)) {\r\n            if (systemParam instanceof EventReader) {\r\n                eventBus.unsubscribeReader(systemParam);\r\n            }\r\n        }\r\n    }\r\n}\r\n", "import type {IEventBus} from \"./event-bus.spec.ts\";\r\nimport type {IEventWriter} from \"./event-writer.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\n\r\nexport * from \"./event-writer.spec\";\r\n\r\nexport class EventWriter<T extends TObjectProto> implements IEventWriter<T>{\r\n    constructor(\r\n        protected bus: IEventBus\r\n    ) {}\r\n\r\n    publish(event: Readonly<InstanceType<T>>): Promise<void> {\r\n        return this.bus.publish(event);\r\n    }\r\n}\r\n", "import type {IEventBus} from \"./event-bus.spec.ts\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {IEventReader} from \"./event-reader.spec.ts\";\r\nimport {EventReader} from \"./event-reader.ts\";\r\nimport {EventWriter} from \"./event-writer.ts\";\r\nimport type {TSubscriber} from \"./_.ts\";\r\n\r\nexport * from \"./event-bus.spec\";\r\n\r\nexport class EventBus implements IEventBus {\r\n    protected subscribers = new Map<Readonly<TObjectProto>, Set<TSubscriber<TObjectProto>>>();\r\n\r\n    createReader<T extends TObjectProto>(Event: Readonly<T>): EventReader<T> {\r\n        return new EventReader(this, Event);\r\n    }\r\n\r\n    createWriter<T extends TObjectProto>(): EventWriter<T> {\r\n        return new EventWriter(this);\r\n    }\r\n\r\n    async publish(event: Readonly<object>): Promise<void> {\r\n        const subscribers = this.subscribers.get(event.constructor as TObjectProto) ?? [];\r\n        let handler;\r\n\r\n        for (handler of subscribers.values()) {\r\n            await handler(event);\r\n        }\r\n    }\r\n\r\n    subscribe<T extends TObjectProto>(Event: T, handler: TSubscriber<T>): void {\r\n        let subscriberList = this.subscribers.get(Event);\r\n\r\n        if (!subscriberList) {\r\n            subscriberList = new Set();\r\n            this.subscribers.set(Event, subscriberList);\r\n        }\r\n\r\n        subscriberList.add(handler);\r\n    }\r\n\r\n    subscribeReader<T extends TObjectProto>(reader: Readonly<IEventReader<T>>): void {\r\n        this.subscribe(reader.eventType, reader.eventHandler);\r\n    }\r\n\r\n    unsubscribe<T extends TObjectProto>(Event: T, handler: TSubscriber<T>): void {\r\n        let subscriberList = this.subscribers.get(Event);\r\n\r\n        if (!subscriberList) {\r\n            subscriberList = new Set();\r\n            this.subscribers.set(Event, subscriberList);\r\n        }\r\n\r\n        subscriberList.delete(handler);\r\n    }\r\n\r\n    unsubscribeReader<T extends TObjectProto>(reader: Readonly<EventReader<T>>): void {\r\n        this.unsubscribe(reader.eventType, reader.eventHandler);\r\n    }\r\n}\r\n", "import {Entity} from \"../../../entity/entity.ts\";\r\nimport type {ICommandEntityBuilder} from \"./command-entity-builder.spec.ts\";\r\nimport type {TObjectProto} from \"../../../_.spec.ts\";\r\nimport type {IWorld} from \"../../world.spec.ts\";\r\nimport {ICommands} from \"./commands.spec.ts\";\r\n\r\nexport * from './command-entity-builder.spec';\r\n\r\nexport class CommandEntityBuilder implements ICommandEntityBuilder {\r\n    protected entity: Entity = new Entity();\r\n\r\n    constructor(\r\n        protected world: Readonly<IWorld>,\r\n        protected commands: Readonly<ICommands>,\r\n    ) {}\r\n\r\n    build(): void {\r\n        this.commands.addEntity(this.entity);\r\n    }\r\n\r\n    with(component: object | TObjectProto, ...args: ReadonlyArray<unknown>): CommandEntityBuilder {\r\n        this.entity.addComponent(component, ...args);\r\n        return this;\r\n    }\r\n\r\n    withAll(...components: ReadonlyArray<object | TObjectProto>): CommandEntityBuilder {\r\n        let component;\r\n\r\n        for (component of components) {\r\n            this.with(component);\r\n        }\r\n\r\n        return this;\r\n    }\r\n}\r\n", "import type {ICommands} from \"./commands.spec.ts\";\r\nimport type {IEntity, IReadOnlyEntity} from \"../../../entity/entity.spec.ts\";\r\nimport type {TTypeProto} from \"../../../_.spec.ts\";\r\nimport type {TDeserializer, ISerDeOptions} from \"../../../serde/serde.spec.ts\";\r\nimport type {ISerialFormat} from \"../../../serde/serial-format.spec.ts\";\r\nimport type {TGroupHandle} from \"../../world.spec.ts\";\r\nimport type {IIStateProto} from \"../../../state/state.spec.ts\";\r\nimport type {TCommand} from \"./commands-aggregator.spec.ts\";\r\nimport {CommandEntityBuilder} from \"./command-entity-builder.ts\";\r\nimport {RuntimeWorld} from \"../runtime-world.ts\";\r\nimport type {IPreptimeWorld} from \"../../preptime/preptime-world.spec.ts\";\r\nimport {IQuery} from \"../../../query/query.spec.ts\";\r\nimport {addEntitySym} from \"../../../query/_.ts\";\r\nimport {Entity} from \"../../../entity/entity.ts\";\r\n\r\nexport * from \"./commands.spec\";\r\n\r\nexport class Commands implements ICommands {\r\n    protected commands: Array<TCommand> = [];\r\n\r\n    constructor(\r\n        protected readonly world: RuntimeWorld,\r\n        protected readonly queries: ReadonlySet<Readonly<IQuery<unknown, unknown>>>,\r\n    ) {}\r\n\r\n    addEntity(entity: Readonly<IEntity>): void {\r\n        this.commands.push(() => {\r\n            this.world.addEntity(entity);\r\n\r\n            let query;\r\n            for (query of this.queries) {\r\n                query[addEntitySym](entity);\r\n            }\r\n        });\r\n    }\r\n\r\n    addResource<T extends object>(obj: TTypeProto<T> | T, ...args: ReadonlyArray<unknown>): T {\r\n        let type: TTypeProto<T>;\r\n        let instance: T;\r\n\r\n        if (typeof obj === 'object') {\r\n            type = obj.constructor as TTypeProto<T>;\r\n            instance = obj;\r\n        } else {\r\n            type = obj;\r\n            instance = new (obj.prototype.constructor.bind(obj, ...Array.from(arguments).slice(1)))();\r\n        }\r\n\r\n        if (this.world.data.resources.has(type)) {\r\n            throw new Error(`Resource with name \"${type.name}\" already exists!`);\r\n        }\r\n\r\n        this.commands.push(() => {\r\n            if (this.world.data.resources.has(type)) {\r\n                throw new Error(`Resource with name \"${type.name}\" already exists!`);\r\n            }\r\n\r\n            this.world.data.resources.set(type, instance);\r\n        });\r\n\r\n        return instance;\r\n    }\r\n\r\n    buildEntity(): CommandEntityBuilder {\r\n        return new CommandEntityBuilder(this.world, this);\r\n    }\r\n\r\n    clearEntities(): void {\r\n        this.commands.push(() => { this.world.data.entities.clear() });\r\n    }\r\n\r\n    async executeAll(): Promise<void> {\r\n        if (this.commands.length > 0) {\r\n            for (let command = this.commands.shift(); !!command; command = this.commands.shift()) {\r\n                await command();\r\n            }\r\n        }\r\n    }\r\n\r\n    load(prefab: Readonly<ISerialFormat>, options?: Readonly<ISerDeOptions<TDeserializer>>): TGroupHandle {\r\n        const handle = this.world.createGroup();\r\n        this.commands.push(() => {\r\n            this.world.load(prefab, options, handle);\r\n\r\n            let entity, query;\r\n            for (entity of this.world.getGroupEntities(handle)) {\r\n                for (query of this.queries) {\r\n                    query[addEntitySym](entity);\r\n                }\r\n            }\r\n        });\r\n        return handle;\r\n    }\r\n\r\n    merge(world: Readonly<IPreptimeWorld>): TGroupHandle {\r\n        const handle = this.world.createGroup();\r\n        this.commands.push(() => { this.world.merge(world, handle) });\r\n        return handle;\r\n    }\r\n\r\n    mutateEntity(entity: Readonly<IReadOnlyEntity>, mutator: (entity: IEntity) => Promise<void> | void): void {\r\n        if (!(entity instanceof Entity)) {\r\n            throw new Error(`The entity \"${entity.id}\" cannot be mutated!`);\r\n        }\r\n\r\n        mutator(entity);\r\n        this.commands.push(() => {\r\n            this.world.removeEntity(entity);\r\n            this.world.addEntity(entity);\r\n        });\r\n    }\r\n\r\n    popState(): void {\r\n        this.commands.push(() => this.world.popState());\r\n    }\r\n\r\n    pushState(NewState: IIStateProto): void {\r\n        this.commands.push(() => this.world.pushState(NewState));\r\n    }\r\n\r\n    queueCommand(command: TCommand) {\r\n        this.commands.push(command);\r\n    }\r\n\r\n    removeEntity(entity: Readonly<IEntity>): void {\r\n        this.commands.push(() => this.world.removeEntity(entity));\r\n    }\r\n\r\n    removeGroup(handle: TGroupHandle): void {\r\n        this.commands.push(() => this.world.removeGroup(handle));\r\n    }\r\n\r\n    removeResource<T extends object>(type: TTypeProto<T>): void {\r\n        if (!this.world.data.resources.has(type)) {\r\n            throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n        }\r\n\r\n        this.commands.push(() => {\r\n            if (!this.world.data.resources.has(type)) {\r\n                throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n            }\r\n\r\n            this.world.data.resources.delete(type);\r\n        });\r\n    }\r\n\r\n    replaceResource<T extends object>(obj: TTypeProto<T> | T, ...args: ReadonlyArray<unknown>): void {\r\n        let type: TTypeProto<T>;\r\n\r\n        if (typeof obj === 'object') {\r\n            type = obj.constructor as TTypeProto<T>;\r\n        } else {\r\n            type = obj;\r\n        }\r\n\r\n        if (!this.world.data.resources.has(type)) {\r\n            throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n        }\r\n\r\n        this.commands.push(() => {\r\n            if (!this.world.data.resources.has(type)) {\r\n                throw new Error(`Resource with name \"${type.name}\" does not exists!`);\r\n            }\r\n\r\n            this.world.data.resources.delete(type);\r\n            this.world.addResource(obj, ...args);\r\n        });\r\n    }\r\n\r\n    stopRun(): void {\r\n        this.commands.push(() => this.world.stop());\r\n    }\r\n}\r\n", "import {RuntimeWorld} from \"./runtime-world.ts\";\r\nimport {SimECSSystemAddResource} from \"../../events/internal-events.ts\";\r\n\r\nexport function registerSystemAddResourceEvent(this: RuntimeWorld) {\r\n    this.eventBus.subscribe(SimECSSystemAddResource, event => {\r\n        this.systemResourceMap.set(event.system, {\r\n            paramName: event.paramName,\r\n            resourceType: event.resource,\r\n        });\r\n    });\r\n}\r\n", "import type {\r\n    IRuntimeWorld,\r\n    IRuntimeWorldInitConfig,\r\n    IRuntimeWorldInitData,\r\n    TExecutionFunction,\r\n} from \"./runtime-world.spec\";\r\nimport {\r\n    buildEntity,\r\n    clearEntities,\r\n    createEntity,\r\n    getEntities,\r\n} from \"../common/world_entities\";\r\nimport {\r\n    addEntitiesToGroup,\r\n    addEntityToGroup,\r\n    assimilateGroup,\r\n    clearGroups,\r\n    createGroup,\r\n    getGroupEntities,\r\n    removeGroup,\r\n} from \"../common/world_groups\";\r\nimport {merge} from \"../common/world_misc.ts\";\r\nimport {load, save} from \"./runtime-world_prefabs.ts\";\r\nimport {\r\n    clearResources,\r\n    getResource,\r\n    getResources,\r\n    hasResource,\r\n    removeResource,\r\n} from \"../common/world_resources\";\r\nimport {addEntity, hasEntity, removeEntity} from \"./runtime-world_entities.ts\";\r\nimport {addResource, replaceResource} from \"./runtime-world_resources.ts\";\r\nimport {SimECSPushDownAutomaton} from \"../../pda/sim-ecs-pda.ts\";\r\nimport type {IState} from \"../../state/state.spec.ts\";\r\nimport {popState, pushState} from \"./runtime-world_states.ts\";\r\nimport {EventBus} from \"../../events/event-bus.ts\";\r\nimport type {IScheduler} from \"../../scheduler/scheduler.spec.ts\";\r\nimport type {TExecutor, TObjectProto} from \"../../_.spec.ts\";\r\nimport type {IMutableWorld} from \"../world.spec.ts\";\r\nimport {Commands} from \"./commands/commands.ts\";\r\nimport type {ISystemActions, ITransitionActions} from \"../actions.spec.ts\";\r\nimport {getQueriesFromSystem} from \"../../system/system.ts\";\r\nimport type {ISystem} from \"../../system/system.spec.ts\";\r\nimport {setEntitiesSym} from \"../../query/_.ts\";\r\nimport type {IRuntimeWorldData} from \"./runtime-world.spec.ts\";\r\nimport {Query} from \"../../query/query.ts\";\r\nimport {registerSystemAddResourceEvent} from \"./runtime-world_events.ts\";\r\nimport {SimECSPDAPushStateEvent} from \"../../events/internal-events.ts\";\r\nimport type {ISyncPoint} from \"../../scheduler/pipeline/sync-point.spec.ts\";\r\n\r\nexport * from \"./runtime-world.spec\";\r\nexport * from \"./commands/commands.spec\";\r\n\r\n\r\nexport class RuntimeWorld implements IRuntimeWorld, IMutableWorld {\r\n    protected awaiterReject!: Function;\r\n    protected awaiterResolve!: Function;\r\n    #awaiter?: Promise<void>;\r\n    protected readonly commands: Commands;\r\n    protected currentScheduler: IScheduler;\r\n    protected currentSchedulerExecutor?: TExecutor;\r\n    public data: IRuntimeWorldData;\r\n    public readonly eventBus = new EventBus();\r\n    protected executionFunction: TExecutionFunction;\r\n    protected isPrepared = false;\r\n    protected readonly pda = new SimECSPushDownAutomaton<IState>(this);\r\n    protected queries = new Set<Readonly<Query<unknown, unknown>>>();\r\n    protected shouldRunSystems = false;\r\n    protected systemResourceMap = new Map<Readonly<ISystem>, Readonly<{ paramName: string, resourceType: Readonly<TObjectProto> }>>();\r\n    protected systemWorld: ISystemActions;\r\n    protected transitionWorld: ITransitionActions;\r\n\r\n    constructor(\r\n        public name: string,\r\n        public config: IRuntimeWorldInitConfig,\r\n        $data?: Partial<IRuntimeWorldInitData>,\r\n    ) {\r\n        this.commands = new Commands(this, this.queries);\r\n        this.currentScheduler = this.config.defaultScheduler;\r\n        this.executionFunction = this.config.executionFunction ?? (\r\n            typeof requestAnimationFrame == 'function'\r\n                ? requestAnimationFrame\r\n                : setTimeout\r\n        );\r\n\r\n        this.data = {\r\n            entities: new Set($data?.entities ? $data?.entities : new Set()),\r\n            groups: $data?.groups ?? {\r\n                entityLinks: new Map(),\r\n                nextHandle: 0,\r\n            },\r\n            resources: new Map(),\r\n        };\r\n\r\n        if ($data?.resources) {\r\n            for (const [Type, args] of $data.resources) {\r\n                this.addResource(Type, ...args);\r\n            }\r\n        }\r\n\r\n        {\r\n            const self = this;\r\n            this.systemWorld = {\r\n                get commands() { return self.commands },\r\n                get currentState() { return self.currentState },\r\n                getEntities: this.getEntities.bind(this),\r\n                // @ts-ignore TS bug?\r\n                getResource: this.getResource.bind(this),\r\n                hasResource: this.hasResource.bind(this),\r\n            };\r\n            this.transitionWorld = Object.assign({\r\n                eventBus: this.eventBus,\r\n                popState: this.popState.bind(this),\r\n                pushState: this.pushState.bind(this),\r\n                flushCommands: this.flushCommands.bind(this),\r\n                save: this.save.bind(this),\r\n            }, this.systemWorld)\r\n        }\r\n\r\n        this.registerSystemAddResourceEvent();\r\n        //this.registerSystemReplaceResourceEvent();\r\n    }\r\n\r\n    get awaiter(): Promise<void> | undefined {\r\n        return this.#awaiter;\r\n    }\r\n\r\n    get currentState(): Readonly<IState> | undefined {\r\n        return this.pda.state;\r\n    }\r\n\r\n    get isRunning(): boolean {\r\n        return Boolean(this.#awaiter);\r\n    }\r\n\r\n    get systemActions(): ISystemActions {\r\n        return this.systemWorld;\r\n    }\r\n\r\n    get transitionActions(): ITransitionActions {\r\n        return this.transitionWorld;\r\n    }\r\n\r\n    public flushCommands(): Promise<void> {\r\n        return this.commands.executeAll();\r\n    }\r\n\r\n    public async prepare(): Promise<void> {\r\n        await this.config.defaultScheduler.prepare(this);\r\n        this.pda.clear();\r\n\r\n        {\r\n            let scheduler;\r\n            let query, system;\r\n\r\n            for (system of this.config.defaultScheduler.getSystems()) {\r\n                for (query of getQueriesFromSystem(system)) {\r\n                    this.queries.add(query);\r\n                }\r\n            }\r\n\r\n            for (scheduler of this.config.stateSchedulers.values()) {\r\n                await scheduler.prepare(this);\r\n\r\n                for (system of scheduler.getSystems()) {\r\n                    for (query of getQueriesFromSystem(system)) {\r\n                        this.queries.add(query);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (query of this.queries) {\r\n                query[setEntitiesSym](this.data.entities.values());\r\n            }\r\n        }\r\n\r\n        this.isPrepared = true;\r\n    }\r\n\r\n    public start(): Promise<void> {\r\n        if (!this.isPrepared) {\r\n            throw new Error(`The runtime world \"${this.name}\" wasn't prepared, yet!`);\r\n        }\r\n\r\n        if (this.#awaiter) {\r\n            throw new Error(`The runtime world \"${this.name}\" is already running!`);\r\n        }\r\n\r\n        this.#awaiter = new Promise<void>((resolve, reject) => {\r\n            this.awaiterReject = reject;\r\n            this.awaiterResolve = resolve;\r\n        });\r\n\r\n        (async () => {\r\n            const syncPoints = new Set<ISyncPoint>();\r\n\r\n            const syncHandler = async () => {\r\n                try {\r\n                    await this.commands.executeAll();\r\n                } catch (error) {\r\n                    if (typeof error == 'object' && error != null) {\r\n                        await this.eventBus.publish(error);\r\n                    } else {\r\n                        throw error;\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.eventBus.subscribe(SimECSPDAPushStateEvent, event => {\r\n                const stateScheduler = this.config.stateSchedulers.get(event.state) ?? this.config.defaultScheduler;\r\n                let syncPoint;\r\n\r\n                for (syncPoint of stateScheduler.pipeline!.getGroups()) {\r\n                    syncPoints.add(syncPoint);\r\n                    syncPoint.addOnSyncHandler(syncHandler);\r\n                }\r\n            });\r\n\r\n            await this.pushState(this.config.initialState);\r\n\r\n            {\r\n                const execFn = this.executionFunction;\r\n                const cleanUp = () => {\r\n                    this.pda.clear();\r\n\r\n                    {\r\n                        let syncPoint;\r\n                        for (syncPoint of syncPoints) {\r\n                            syncPoint.clearOnSyncHandlers();\r\n                        }\r\n                    }\r\n\r\n                    this.#awaiter = undefined;\r\n                    this.awaiterResolve();\r\n                };\r\n\r\n                const mainLoop = async () => {\r\n                    if (!this.shouldRunSystems) {\r\n                        cleanUp();\r\n                        return;\r\n                    }\r\n\r\n                    try {\r\n                        await this.currentSchedulerExecutor!();\r\n                    } catch (error) {\r\n                        if (typeof error == 'object' && error != null) {\r\n                            await this.eventBus.publish(error);\r\n                        } else {\r\n                            throw error;\r\n                        }\r\n                    }\r\n\r\n                    execFn(mainLoop);\r\n                }\r\n\r\n                this.shouldRunSystems = true;\r\n                execFn(mainLoop);\r\n            }\r\n        })().catch(err => {\r\n            this.awaiterReject(err);\r\n            this.#awaiter = undefined;\r\n        });\r\n\r\n        return this.#awaiter;\r\n    }\r\n\r\n    public async step(): Promise<void> {\r\n        const originalExecutionFn = this.executionFunction;\r\n        this.executionFunction = (mainLoop: Function) => {\r\n            originalExecutionFn(() => {\r\n                mainLoop();\r\n                this.stop();\r\n            });\r\n        };\r\n        await this.start();\r\n        this.executionFunction = originalExecutionFn;\r\n    }\r\n\r\n    public stop(): void {\r\n        this.shouldRunSystems = false;\r\n    }\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Entities\r\n    /// ****************************************************************************************************************\r\n\r\n    public addEntity = addEntity;\r\n    public buildEntity = buildEntity;\r\n    public clearEntities = clearEntities;\r\n    public createEntity = createEntity;\r\n    public getEntities = getEntities;\r\n    public hasEntity = hasEntity;\r\n    public removeEntity = removeEntity;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Events\r\n    /// ****************************************************************************************************************\r\n\r\n    protected registerSystemAddResourceEvent = registerSystemAddResourceEvent;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Groups\r\n    /// ****************************************************************************************************************\r\n\r\n    public addEntityToGroup = addEntityToGroup;\r\n    public addEntitiesToGroup = addEntitiesToGroup;\r\n    public assimilateGroup = assimilateGroup;\r\n    public clearGroups = clearGroups;\r\n    public createGroup = createGroup;\r\n    public getGroupEntities = getGroupEntities;\r\n    public removeGroup = removeGroup;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Misc\r\n    /// ****************************************************************************************************************\r\n\r\n    public merge = merge;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Prefabs\r\n    /// ****************************************************************************************************************\r\n\r\n    public load = load;\r\n    public save = save;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Resources\r\n    /// ****************************************************************************************************************\r\n\r\n    public addResource = addResource;\r\n    public clearResources = clearResources;\r\n    public getResource = getResource;\r\n    public getResources = getResources;\r\n    public hasResource = hasResource;\r\n    public removeResource = removeResource;\r\n    public replaceResource = replaceResource;\r\n\r\n\r\n    /// ****************************************************************************************************************\r\n    /// States\r\n    /// ****************************************************************************************************************\r\n\r\n    /**\r\n     * Remove the current state and switch to the last one\r\n     * @protected\r\n     */\r\n    public popState = popState;\r\n\r\n    /**\r\n     * Switch to a new state\r\n     * @protected\r\n     */\r\n    public pushState = pushState;\r\n}\r\n", "import type {IState, IIStateProto} from \"./state.spec.ts\";\r\nimport type {ITransitionActions} from \"../world/actions.spec.ts\";\r\n\r\nexport * from './state.spec';\r\n\r\nexport class State implements IState {\r\n    activate(actions: Readonly<ITransitionActions>): void | Promise<void> {}\r\n\r\n    create(actions: Readonly<ITransitionActions>): void | Promise<void> {}\r\n\r\n    deactivate(actions: Readonly<ITransitionActions>): void | Promise<void> {}\r\n\r\n    destroy(actions: Readonly<ITransitionActions>): void | Promise<void> {}\r\n}\r\n\r\nexport interface IStateProto extends IIStateProto { new(): State }", "import type {IPreptimeOptions, IPreptimeWorld, IPreptimeWorldConfig} from \"./preptime-world.spec.ts\";\r\nimport {SerDe} from \"../../serde/serde.ts\";\r\nimport {Scheduler} from \"../../scheduler/scheduler.ts\";\r\nimport {\r\n    buildEntity,\r\n    clearEntities,\r\n    createEntity,\r\n    getEntities,\r\n} from \"../common/world_entities\";\r\nimport {\r\n    clearResources,\r\n    getResource,\r\n    getResources,\r\n    hasResource,\r\n    removeResource,\r\n} from \"../common/world_resources\";\r\nimport {\r\n    addEntitiesToGroup,\r\n    addEntityToGroup,\r\n    assimilateGroup,\r\n    clearGroups,\r\n    createGroup,\r\n    getGroupEntities,\r\n    removeGroup,\r\n} from \"../common/world_groups\";\r\nimport {addEntity, hasEntity, removeEntity} from \"./preptime-world_entities.ts\";\r\nimport {addResource} from \"./preptime-world_resources.ts\";\r\nimport {load, save} from \"./preptime-world_prefabs.ts\";\r\nimport {merge} from \"../common/world_misc.ts\";\r\nimport type {IRuntimeWorld} from \"../runtime/runtime-world.spec.ts\";\r\nimport {RuntimeWorld} from \"../runtime/runtime-world.ts\";\r\nimport {State} from \"../../state/state.ts\";\r\nimport type {IPreptimeData} from \"./preptime-world.spec.ts\";\r\n\r\nexport * from \"./preptime-world.spec\";\r\n\r\n\r\nexport class PreptimeWorld implements IPreptimeWorld {\r\n    public config: IPreptimeWorldConfig;\r\n    public data: IPreptimeData;\r\n\r\n    constructor(\r\n        public name?: string,\r\n        $config?: Partial<IPreptimeWorldConfig>,\r\n        $data?: Partial<IPreptimeData>,\r\n    ) {\r\n        {\r\n            const config = $config\r\n                ? $config\r\n                : {};\r\n\r\n            this.config = {\r\n                defaultScheduler: config.defaultScheduler ?? new Scheduler(),\r\n                serde: config.serde ?? new SerDe(),\r\n                stateSchedulers: config.stateSchedulers ?? new Map(),\r\n            };\r\n        }\r\n\r\n        {\r\n            const data = $data\r\n                ? $data\r\n                : {};\r\n\r\n            this.data = {\r\n                entities: data.entities ?? new Set(),\r\n                groups: data.groups ?? {\r\n                    entityLinks: new Map(),\r\n                    nextHandle: 0,\r\n                },\r\n                resources: data.resources ?? new Map(),\r\n            };\r\n        }\r\n    }\r\n\r\n    public async prepareRun(options?: Readonly<Partial<IPreptimeOptions>>): Promise<IRuntimeWorld> {\r\n        // todo: don't copy the refs, copy all objects\r\n\r\n        const name = this.name\r\n            ? this.name + '_run'\r\n            : 'NO_NAME';\r\n\r\n        const runWorld = new RuntimeWorld(\r\n            name,\r\n            Object.assign({\r\n                executionFunction: options?.executionFunction,\r\n                initialState: options?.initialState ?? State,\r\n\r\n            }, this.config),\r\n            this.data,\r\n        );\r\n\r\n        await runWorld.prepare();\r\n        return runWorld;\r\n    }\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Entities\r\n    /// ****************************************************************************************************************\r\n    public addEntity = addEntity;\r\n    public buildEntity = buildEntity;\r\n    public clearEntities = clearEntities;\r\n    public createEntity = createEntity;\r\n    public getEntities = getEntities;\r\n    public hasEntity = hasEntity;\r\n    public removeEntity = removeEntity;\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Groups\r\n    /// ****************************************************************************************************************\r\n    public addEntityToGroup = addEntityToGroup;\r\n    public addEntitiesToGroup = addEntitiesToGroup;\r\n    public assimilateGroup = assimilateGroup;\r\n    public clearGroups = clearGroups;\r\n    public createGroup = createGroup;\r\n    public getGroupEntities = getGroupEntities;\r\n    public removeGroup = removeGroup;\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Misc\r\n    /// ****************************************************************************************************************\r\n    public merge = merge;\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Prefabs\r\n    /// ****************************************************************************************************************\r\n    public load = load;\r\n    public save = save;\r\n\r\n    /// ****************************************************************************************************************\r\n    /// Resources\r\n    /// ****************************************************************************************************************\r\n    public addResource = addResource;\r\n    public clearResources = clearResources;\r\n    public getResource = getResource;\r\n    public getResources = getResources;\r\n    public hasResource = hasResource;\r\n    public removeResource = removeResource;\r\n}\r\n", "import type {\r\n    IObjectRegistrationOptions,\r\n    IWorldBuilder,\r\n} from \"./world-builder.spec\";\r\nimport type {TObjectProto} from \"../_.spec.ts\";\r\nimport type {ISerDe} from \"../serde/serde.spec.ts\";\r\nimport {dataStructDeserializer, dataStructSerializer} from \"./world-builder.util.ts\";\r\nimport {type IScheduler, Scheduler} from \"../scheduler/scheduler.ts\";\r\nimport type {ISyncPoint} from \"../scheduler/pipeline/sync-point.spec.ts\";\r\nimport type {IIStateProto} from \"../state/state.spec.ts\";\r\nimport {addSyncPoint} from \"../ecs/ecs-sync-point.ts\";\r\nimport {PreptimeWorld} from \"./preptime/preptime-world.ts\";\r\nimport type {IResourceRegistrationOptions} from \"./world-builder.spec.ts\";\r\n\r\nexport * from './world-builder.spec';\r\n\r\nexport class WorldBuilder implements IWorldBuilder {\r\n    protected callbacks = new Set<(world: PreptimeWorld) => void>();\r\n    protected worldName?: string;\r\n    protected defaultScheduler: Readonly<IScheduler> = new Scheduler();\r\n    protected resources = new Map<Readonly<TObjectProto>, ReadonlyArray<unknown>>();\r\n    protected stateSchedulers = new Map<IIStateProto, Readonly<IScheduler>>();\r\n\r\n    constructor(\r\n        protected serde: Readonly<ISerDe>,\r\n    ) {}\r\n\r\n    addCallback(cb: (world: Readonly<PreptimeWorld>) => void): WorldBuilder {\r\n        this.callbacks.add(cb);\r\n        return this;\r\n    }\r\n\r\n    build(): PreptimeWorld {\r\n        const world = new PreptimeWorld(\r\n            this.worldName,\r\n            {\r\n                defaultScheduler: this.defaultScheduler!,\r\n                serde: this.serde,\r\n                stateSchedulers: this.stateSchedulers,\r\n            },\r\n            {\r\n                resources: this.resources,\r\n            }\r\n        );\r\n\r\n        for (const cb of this.callbacks) {\r\n            cb(world);\r\n        }\r\n\r\n        return world;\r\n    }\r\n\r\n    c(Component: TObjectProto, options?: Readonly<IObjectRegistrationOptions>): WorldBuilder {\r\n        return this.withComponent(Component, options);\r\n    }\r\n\r\n    protected checkSyncPointLoop(root: Readonly<ISyncPoint>): void {\r\n        if (this.hasSyncPointLoop(root)) {\r\n            throw new Error('The sync-points provided form a loop!');\r\n        }\r\n    }\r\n\r\n    component(Component: TObjectProto, options?: Readonly<IObjectRegistrationOptions>): WorldBuilder {\r\n        return this.withComponent(Component, options);\r\n    }\r\n\r\n    components(...Components: ReadonlyArray<TObjectProto>): WorldBuilder {\r\n        return this.withComponents(...Components);\r\n    }\r\n\r\n    protected hasSyncPointLoop(root: Readonly<ISyncPoint>): boolean {\r\n        const check = (root: ISyncPoint, direction: 'after' | 'before') => {\r\n            const syncPoints = new Set<ISyncPoint>();\r\n            let currentSyncPoint = root;\r\n            let lookAheadSyncPoint = currentSyncPoint[direction];\r\n\r\n            while (lookAheadSyncPoint) {\r\n                if (syncPoints.has(lookAheadSyncPoint)) {\r\n                    return true;\r\n                }\r\n\r\n                currentSyncPoint = lookAheadSyncPoint;\r\n                lookAheadSyncPoint = currentSyncPoint[direction];\r\n\r\n                syncPoints.add(currentSyncPoint);\r\n            }\r\n\r\n            return false;\r\n        };\r\n\r\n        if (check(root, 'after')) {\r\n            return true;\r\n        }\r\n\r\n        return check(root, 'before');\r\n    }\r\n\r\n    name(name: string): WorldBuilder {\r\n        return this.withName(name);\r\n    }\r\n\r\n    r(Resource: TObjectProto, options?: Readonly<Partial<IResourceRegistrationOptions>>): IWorldBuilder {\r\n        return this.withResource(Resource, options);\r\n    }\r\n\r\n    resource(Resource: TObjectProto, options?: Readonly<Partial<IResourceRegistrationOptions>>): IWorldBuilder {\r\n        return this.withResource(Resource, options);\r\n    }\r\n\r\n    protected registerAllNamedSyncPoints(root: ISyncPoint) {\r\n        let currentSyncPoint = root;\r\n\r\n        // register root\r\n        if (root.name) {\r\n            addSyncPoint(root);\r\n        }\r\n\r\n        // register all sync-points before root\r\n        while (currentSyncPoint.before) {\r\n            currentSyncPoint = currentSyncPoint.before;\r\n\r\n            if (currentSyncPoint.name) {\r\n                addSyncPoint(currentSyncPoint);\r\n            }\r\n        }\r\n\r\n        // reset to root\r\n        currentSyncPoint = root;\r\n\r\n        // register all sync-points after root\r\n        while (currentSyncPoint.after) {\r\n            currentSyncPoint = currentSyncPoint.after;\r\n\r\n            if (currentSyncPoint.name) {\r\n                addSyncPoint(currentSyncPoint);\r\n            }\r\n        }\r\n    }\r\n\r\n    updateRootSyncPoint(updater: (root: ISyncPoint) => void): WorldBuilder {\r\n        updater(this.defaultScheduler.pipeline.root);\r\n        return this;\r\n    }\r\n\r\n    withComponent(Component: TObjectProto, options?: Readonly<IObjectRegistrationOptions>): WorldBuilder {\r\n        this.serde.registerTypeHandler(\r\n            Component,\r\n            options?.serDe?.deserializer ?? dataStructDeserializer.bind(undefined, Component),\r\n            options?.serDe?.serializer ?? dataStructSerializer\r\n        );\r\n\r\n        return this;\r\n    }\r\n\r\n    withComponents(...Components: ReadonlyArray<TObjectProto>): WorldBuilder {\r\n        for (const Component of Components) {\r\n            this.withComponent(Component);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    withDefaultScheduler(scheduler: Readonly<IScheduler>): IWorldBuilder {\r\n        const root = scheduler.pipeline.root;\r\n\r\n        this.checkSyncPointLoop(root);\r\n        this.defaultScheduler = scheduler;\r\n        this.registerAllNamedSyncPoints(root);\r\n\r\n        return this;\r\n    }\r\n\r\n    withDefaultScheduling(planner: (root: ISyncPoint) => void): WorldBuilder {\r\n        const root = this.defaultScheduler.pipeline.root;\r\n\r\n        this.checkSyncPointLoop(root);\r\n        planner(root);\r\n        this.registerAllNamedSyncPoints(root);\r\n\r\n        return this;\r\n    }\r\n\r\n    withName(name: string): WorldBuilder {\r\n        this.worldName = name;\r\n        return this;\r\n    }\r\n\r\n    withResource(Resource: TObjectProto, options?: Readonly<Partial<IResourceRegistrationOptions>>): WorldBuilder {\r\n        this.resources.set(Resource, options?.constructorArgs ?? []);\r\n        this.serde.registerTypeHandler(\r\n            Resource,\r\n            options?.serDe?.deserializer ?? dataStructDeserializer.bind(undefined, Resource),\r\n            options?.serDe?.serializer ?? dataStructSerializer\r\n        );\r\n\r\n        return this;\r\n    }\r\n\r\n    withResources(Resources: ReadonlyArray<TObjectProto>): WorldBuilder {\r\n        for (const Resource of Resources) {\r\n            this.withResource(Resource);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    withStateScheduler(state: IIStateProto, scheduler: Readonly<IScheduler>): WorldBuilder {\r\n        if (this.stateSchedulers.has(state)) {\r\n            throw new Error(`A scheduler was already assigned to ${state.name}!`);\r\n        }\r\n\r\n        {\r\n            const root = scheduler.pipeline.root;\r\n\r\n            this.checkSyncPointLoop(root);\r\n            this.stateSchedulers.set(state, scheduler);\r\n            this.registerAllNamedSyncPoints(root);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    withStateScheduling(state: IIStateProto, planner: (root: ISyncPoint) => void): WorldBuilder {\r\n        if (this.stateSchedulers.has(state)) {\r\n            throw new Error(`A scheduler was already assigned to ${state.name}!`);\r\n        }\r\n\r\n        {\r\n            const scheduler = new Scheduler();\r\n            const root = scheduler.pipeline.root;\r\n\r\n            this.stateSchedulers.set(state, scheduler);\r\n            planner(root);\r\n            this.checkSyncPointLoop(root);\r\n            this.registerAllNamedSyncPoints(root);\r\n        }\r\n\r\n        return this;\r\n    }\r\n}\r\n\r\n\r\n// Change alias refs for better performance\r\n\r\nWorldBuilder.prototype.c = WorldBuilder.prototype.withComponent;\r\nWorldBuilder.prototype.component = WorldBuilder.prototype.withComponent;\r\nWorldBuilder.prototype.components = WorldBuilder.prototype.withComponents;\r\nWorldBuilder.prototype.name = WorldBuilder.prototype.withName;\r\nWorldBuilder.prototype.r = WorldBuilder.prototype.withResource;\r\nWorldBuilder.prototype.resource = WorldBuilder.prototype.withResource;\r\n", "import {type IWorldBuilder, WorldBuilder} from \"../world/world-builder.ts\";\r\nimport {SerDe} from \"../serde/serde.ts\";\r\nimport type {IPreptimeWorld} from \"../world/preptime/preptime-world.spec.ts\";\r\nimport type {IRuntimeWorld} from \"../world/runtime/runtime-world.spec.ts\";\r\n\r\nconst worlds = new Set<IPreptimeWorld | IRuntimeWorld>();\r\n\r\n/**\r\n * Register a world\r\n * @param world\r\n */\r\nexport function addWorld(world: Readonly<IPreptimeWorld | IRuntimeWorld>) {\r\n    worlds.add(world);\r\n}\r\n\r\n/**\r\n * Build a new world and automatically add it to the list of worlds inside the ECS\r\n */\r\nexport function buildWorld(): IWorldBuilder {\r\n    const serde = new SerDe();\r\n    return new WorldBuilder(serde).addCallback(world => worlds.add(world));\r\n}\r\n\r\n/**\r\n * Get a world with a name\r\n * @param name\r\n */\r\nexport function getWorld(name: string): IPreptimeWorld | IRuntimeWorld | undefined {\r\n    let world;\r\n    for (world of worlds) {\r\n        if (world.name == name) {\r\n            return world;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Iterate over all registered worlds\r\n */\r\nexport function getWorlds(): IterableIterator<IPreptimeWorld | IRuntimeWorld> {\r\n    return worlds.values();\r\n}\r\n\r\n/**\r\n * Remove a world\r\n * @param world\r\n */\r\nexport function removeWorld(world: Readonly<IPreptimeWorld | IRuntimeWorld>) {\r\n    worlds.delete(world);\r\n}\r\n", "import type {IEntity} from \"../entity/entity.spec.ts\";\r\n\r\nexport class EntityAdded {\r\n    constructor(\r\n        public entity: Readonly<IEntity>\r\n    ) {}\r\n}\r\n\r\nexport class EntityRemoved {\r\n    constructor(\r\n        public entity: Readonly<IEntity>\r\n    ) {}\r\n}\r\n"],
  "mappings": "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",
  "names": ["src_exports", "__export", "Actions", "CIdMarker", "CMarkerSeparator", "CRefMarker", "CResourceMarker", "CResourceMarkerValue", "CTagMarker", "EAccess", "EExistence", "EQueryType", "ETargetType", "Entity", "EntityAdded", "EntityBuilder", "EntityRemoved", "EventBus", "Pipeline", "PreptimeWorld", "PushDownAutomaton", "Query", "Read", "ReadEntity", "ReadEvents", "ReadOptional", "ReadResource", "RuntimeWorld", "Scheduler", "SerDe", "SerialFormat", "SimECSPushDownAutomaton", "Stage", "State", "Storage", "SyncPoint", "SystemBuilder", "SystemError", "With", "WithTag", "Without", "WithoutTag", "WorldBuilder", "Write", "WriteEvents", "WriteOptional", "WriteResource", "addSyncPoint", "addWorld", "buildWorld", "clearRegistry", "createSystem", "defaultSchedulingAlgorithm", "defaultStageSchedulingAlgorithm", "getEntity", "getQueriesFromSystem", "getSyncPoint", "getSystemRunParameters", "getWorld", "getWorlds", "queryComponents", "queryEntities", "registerEntity", "removeSyncPoint", "removeWorld", "unregisterEntity", "unregisterEntityId", "__toCommonJS", "entities", "clearRegistry", "entity", "entityRef", "unregisterEntity", "getEntity", "id", "registerEntity", "unregisterEntityId", "EAccess", "EExistence", "ETargetType", "EQueryType", "addEntitySym", "clearEntitiesSym", "removeEntitySym", "setEntitiesSym", "accessDescSym", "existenceDescSym", "idCounter", "_Entity", "uuid", "__publicField", "registerEntity", "component", "args", "obj", "tag", "serde", "serialFormat", "entity", "Entity", "ReadEntity", "uuid", "Entity", "accessDescSym", "Read", "componentPrototype", "ReadOptional", "Write", "WriteOptional", "With", "existenceDescSym", "WithTag", "tag", "Without", "WithoutTag", "Query", "_queryType", "queryDescriptor", "__publicField", "clearEntitiesSym", "removeEntitySym", "entity", "setEntitiesSym", "entities", "addEntitySym", "handler", "data", "EntitiesQuery", "Query", "queryDesc", "addEntitySym", "entity", "componentDesc", "existenceDescSym", "ComponentsQuery", "Query", "queryDescriptor", "addEntitySym", "entity", "descriptor", "components", "accessDesc", "componentDesc", "componentName", "accessDescSym", "queryComponents", "query", "ComponentsQuery", "queryEntities", "EntitiesQuery", "syncPoints", "addSyncPoint", "syncPoint", "name", "getSyncPoint", "removeSyncPoint", "dataStructDeserializer", "Constructor", "data", "obj", "kv", "dataStructSerializer", "component", "systemEventReaderSym", "systemEventWriterSym", "systemResourceTypeSym", "systemRunParamSym", "SystemError", "_cause", "_System", "defaultStageSchedulingAlgorithm", "systems", "eventBus", "system", "systemRunParamSym", "error", "SystemError", "Stage", "__publicField", "System", "SyncPoint", "__publicField", "handler", "stage", "Stage", "after", "before", "stages", "system", "newStage", "Pipeline", "__publicField", "SyncPoint", "orderedPoints", "traversePoint", "point", "Actions", "ReadEvents", "type", "systemEventReaderSym", "ReadResource", "systemResourceTypeSym", "Storage", "initializer", "WriteEvents", "systemEventWriterSym", "WriteResource", "SystemBuilder", "params", "__publicField", "self", "System", "name", "fn", "SimECSPDAEvent", "state", "SimECSPDAPushStateEvent", "SimECSResourceEvent", "resourceType", "resourceObject", "SimECSReplaceResourceEvent", "SimECSResourceEvent", "SimECSSystemResourceEvent", "system", "paramName", "resource", "SimECSSystemAddResource", "SimECSSystemReplaceResource", "createSystem", "parameterDesc", "SystemBuilder", "getQueriesFromSystem", "system", "queries", "param", "Query", "getSystemRunParameters", "world", "runParameters", "paramName", "paramDesc", "Actions", "Storage", "systemResourceTypeSym", "resourceType", "SimECSSystemAddResource", "systemEventReaderSym", "systemEventWriterSym", "defaultSchedulingAlgorithm", "stageExecutors", "stageExecutor", "_isPrepared", "_pipeline", "Scheduler", "__privateAdd", "Pipeline", "__publicField", "__privateGet", "newPipeline", "__privateSet", "eventBus", "group", "stage", "systems", "system", "world", "syncPoint", "systemRunParamSym", "getSystemRunParameters", "CIdMarker", "CMarkerSeparator", "CRefMarker", "CResourceMarker", "CResourceMarkerValue", "CTagMarker", "SerialFormat", "arr", "json", "newVals", "entity", "indentation", "EReferenceType", "Reference", "type", "id", "refString", "marker", "idTokens", "CMarkerSeparator", "CRefMarker", "EReferenceType", "str", "getDefaultSerializer", "customSerializer", "component", "componentName", "serializeObjectReplacer", "getDefaultDeserializer", "customDeserializer", "constructorName", "data", "inOut", "parsedData", "serializeObjectReviver", "row", "NO_KEY", "key", "value", "Entity", "Reference", "SerDe", "__publicField", "data", "options", "finalOptions", "entities", "resources", "components", "objectsWithRefs", "tags", "component", "deserializerOut", "id", "serialComponentData", "serialComponentName", "serialEntity", "tag", "serialResources", "CResourceMarker", "type", "getDefaultDeserializer", "CIdMarker", "CTagMarker", "entity", "Entity", "dereferenceComponentRefs", "Type", "deserializer", "serializer", "outData", "SerialFormat", "serialize", "chunk", "collector", "item", "serialData", "getDefaultSerializer", "key", "value", "Reference", "getEntity", "EntityBuilder", "uuid", "callback", "__publicField", "entity", "Entity", "component", "args", "components", "buildEntity", "uuid", "self", "EntityBuilder", "entity", "clearEntities", "createEntity", "Entity", "getEntities", "query", "clearResources", "getResource", "type", "getResources", "types", "typesArray", "resource", "hasResource", "obj", "removeResource", "addEntityToGroup", "groupHandle", "entity", "addEntitiesToGroup", "entities", "link", "getLink", "assimilateGroup", "otherWorld", "handle", "newGroup", "clearGroups", "createGroup", "getGroupEntities", "world", "removeGroup", "addEntity", "entity", "hasEntity", "removeEntity", "addResource", "Type", "args", "load", "prefab", "options", "intoGroup", "groupHandle", "serdeOut", "entities", "entity", "resource", "save", "resources", "type", "merge", "elsewhere", "intoGroup", "groupHandle", "entities", "entity", "load", "prefab", "options", "intoGroup", "groupHandle", "serdeOut", "entities", "entity", "resource", "save", "resources", "type", "addEntity", "entity", "query", "addEntitySym", "hasEntity", "removeEntity", "removeEntitySym", "addResource", "obj", "args", "type", "instance", "err", "replaceResource", "resourceObj", "SimECSReplaceResourceEvent", "system", "resourceDesc", "systemRunParamSym", "SimECSSystemReplaceResource", "PushDownAutomaton", "__publicField", "oldTail", "State", "SimECSPushDownAutomaton", "PushDownAutomaton", "world", "State", "SimECSPDAPushStateEvent", "EventReader", "bus", "_eventType", "__publicField", "event", "handler", "events", "popState", "unsubscribeEventsOfSchedulerSystems", "newState", "subscribeEventsOfSchedulerSystems", "pushState", "NewState", "eventBus", "scheduler", "systems", "g", "s", "system", "systemParam", "EventReader", "EventWriter", "bus", "event", "EventBus", "__publicField", "Event", "EventReader", "EventWriter", "event", "subscribers", "handler", "subscriberList", "reader", "CommandEntityBuilder", "world", "commands", "__publicField", "Entity", "component", "args", "components", "Commands", "world", "queries", "__publicField", "entity", "query", "addEntitySym", "obj", "args", "type", "instance", "CommandEntityBuilder", "command", "prefab", "options", "handle", "mutator", "Entity", "NewState", "registerSystemAddResourceEvent", "SimECSSystemAddResource", "event", "_awaiter", "RuntimeWorld", "name", "config", "$data", "__publicField", "__privateAdd", "EventBus", "SimECSPushDownAutomaton", "addEntity", "buildEntity", "clearEntities", "createEntity", "getEntities", "hasEntity", "removeEntity", "registerSystemAddResourceEvent", "addEntityToGroup", "addEntitiesToGroup", "assimilateGroup", "clearGroups", "createGroup", "getGroupEntities", "removeGroup", "merge", "load", "save", "addResource", "clearResources", "getResource", "getResources", "hasResource", "removeResource", "replaceResource", "popState", "pushState", "Commands", "Type", "args", "self", "__privateGet", "scheduler", "query", "system", "getQueriesFromSystem", "setEntitiesSym", "__privateSet", "resolve", "reject", "syncPoints", "syncHandler", "error", "SimECSPDAPushStateEvent", "event", "stateScheduler", "syncPoint", "execFn", "cleanUp", "mainLoop", "err", "originalExecutionFn", "State", "actions", "PreptimeWorld", "name", "$config", "$data", "__publicField", "addEntity", "buildEntity", "clearEntities", "createEntity", "getEntities", "hasEntity", "removeEntity", "addEntityToGroup", "addEntitiesToGroup", "assimilateGroup", "clearGroups", "createGroup", "getGroupEntities", "removeGroup", "merge", "load", "save", "addResource", "clearResources", "getResource", "getResources", "hasResource", "removeResource", "config", "Scheduler", "SerDe", "data", "options", "runWorld", "RuntimeWorld", "State", "WorldBuilder", "serde", "__publicField", "Scheduler", "cb", "world", "PreptimeWorld", "Component", "options", "root", "Components", "check", "direction", "syncPoints", "currentSyncPoint", "lookAheadSyncPoint", "name", "Resource", "addSyncPoint", "updater", "dataStructDeserializer", "dataStructSerializer", "scheduler", "planner", "Resources", "state", "worlds", "addWorld", "world", "buildWorld", "serde", "SerDe", "WorldBuilder", "getWorld", "name", "getWorlds", "removeWorld", "EntityAdded", "entity", "EntityRemoved"]
}
