diff --git a/src/index.d.ts b/src/index.d.ts index 6a42670..19c5ed7 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,155 +1,156 @@ type Query = { - /** - * this: Query is necessary to use a colon instead of a period for emits. - */ - - /** - * Modifies the Query to exclude specified components - * @param components The components to exclude - * @returns Modified Query - */ - without: (this: Query, ...components: Entity[]) => Query; - /** - * Modifies component data with a callback function - * @param fn The function to modify data - */ - replace: (this: Query, fn: (...components: T) => T extends [infer U] ? U : LuaTuple) => void; + /** + * this: Query is necessary to use a colon instead of a period for emits. + */ + drain: (this: Query) => Query + with: (this: Query, ...components: Entity[]) => Query + /** + * Modifies the Query to exclude specified components + * @param components The components to exclude + * @returns Modified Query + */ + without: (this: Query, ...components: Entity[]) => Query; + /** + * Modifies component data with a callback function + * @param fn The function to modify data + */ + replace: (this: Query, fn: (...components: T) => T extends [infer U] ? U : LuaTuple) => void; } & IterableFunction>; // Utility Types export type Entity = number & { __nominal_type_dont_use: T }; export type EntityType = T extends Entity ? A : never; export type InferComponents = { - [K in keyof A]: EntityType; + [K in keyof A]: EntityType; }; type Nullable = { - [K in keyof T]: T[K] | undefined; + [K in keyof T]: T[K] | undefined; }; export class World { - /** - * Creates a new World - */ - constructor(); + /** + * Creates a new World + */ + constructor(); - /** - * Creates a new entity - * @returns Entity - */ - entity(): Entity; + /** + * Creates a new entity + * @returns Entity + */ + entity(): Entity; - /** - * Creates a new entity located in the first 256 ids. - * These should be used for static components for fast access. - * @returns Entity - */ - component(): Entity; + /** + * Creates a new entity located in the first 256 ids. + * These should be used for static components for fast access. + * @returns Entity + */ + component(): Entity; - /** - * Gets the target of a relationship. For example, when a user calls - * `world.target(id, ChildOf(parent))`, you will obtain the parent entity. - * @param id Entity - * @param relation The Relationship - * @returns The Parent Entity if it exists - */ - target(id: Entity, relation: Entity): Entity | undefined; + /** + * Gets the target of a relationship. For example, when a user calls + * `world.target(id, ChildOf(parent))`, you will obtain the parent entity. + * @param id Entity + * @param relation The Relationship + * @returns The Parent Entity if it exists + */ + target(id: Entity, relation: Entity): Entity | undefined; - /** - * Clears an entity from the world. - * @praram id Entity to be cleared - */ - clear(id: Entity): void; + /** + * Clears an entity from the world. + * @praram id Entity to be cleared + */ + clear(id: Entity): void; - /** - * Deletes an entity and all its related components and relationships. - * @param id Entity to be destroyed - */ - delete(id: Entity): void; + /** + * Deletes an entity and all its related components and relationships. + * @param id Entity to be destroyed + */ + delete(id: Entity): void; - /** - * Adds a component to the entity with no value - * @param id Target Entity - * @param component Component - */ - add(id: Entity, component: Entity): void; + /** + * Adds a component to the entity with no value + * @param id Target Entity + * @param component Component + */ + add(id: Entity, component: Entity): void; - /** - * Assigns a value to a component on the given entity - * @param id Target Entity - * @param component Target Component - * @param data Component Data - */ - set(id: Entity, component: Entity, data: T): void; + /** + * Assigns a value to a component on the given entity + * @param id Target Entity + * @param component Target Component + * @param data Component Data + */ + set(id: Entity, component: Entity, data: T): void; - /** - * Removes a component from the given entity - * @param id Target Entity - * @param component Target Component - */ - remove(id: Entity, component: Entity): void; + /** + * Removes a component from the given entity + * @param id Target Entity + * @param component Target Component + */ + remove(id: Entity, component: Entity): void; - // Manually typed out get since there is a hard limit. + // Manually typed out get since there is a hard limit. - /** - * Retrieves the value of one component. This value may be undefined. - * @param id Target Entity - * @param component Target Component - * @returns Data associated with the component if it exists - */ - get(id: number, component: Entity): A | undefined; + /** + * Retrieves the value of one component. This value may be undefined. + * @param id Target Entity + * @param component Target Component + * @returns Data associated with the component if it exists + */ + get(id: number, component: Entity): A | undefined; - /** - * Retrieves the value of two components. This value may be undefined. - * @param id Target Entity - * @param component Target Component 1 - * @param component2 Target Component 2 - * @returns Data associated with the components if it exists - */ - get( - id: number, - component: Entity, - component2: Entity - ): LuaTuple>; + /** + * Retrieves the value of two components. This value may be undefined. + * @param id Target Entity + * @param component Target Component 1 + * @param component2 Target Component 2 + * @returns Data associated with the components if it exists + */ + get( + id: number, + component: Entity, + component2: Entity + ): LuaTuple>; - /** - * Retrieves the value of three components. This value may be undefined. - * @param id Target Entity - * @param component Target Component 1 - * @param component2 Target Component 2 - * @param component3 Target Component 3 - * @returns Data associated with the components if it exists - */ - get( - id: number, - component: Entity, - component2: Entity, - component3: Entity - ): LuaTuple>; + /** + * Retrieves the value of three components. This value may be undefined. + * @param id Target Entity + * @param component Target Component 1 + * @param component2 Target Component 2 + * @param component3 Target Component 3 + * @returns Data associated with the components if it exists + */ + get( + id: number, + component: Entity, + component2: Entity, + component3: Entity + ): LuaTuple>; - /** - * Retrieves the value of four components. This value may be undefined. - * @param id Target Entity - * @param component Target Component 1 - * @param component2 Target Component 2 - * @param component3 Target Component 3 - * @param component4 Target Component 4 - * @returns Data associated with the components if it exists - */ - get( - id: number, - component: Entity, - component2: Entity, - component3: Entity, - component4: Entity - ): LuaTuple>; + /** + * Retrieves the value of four components. This value may be undefined. + * @param id Target Entity + * @param component Target Component 1 + * @param component2 Target Component 2 + * @param component3 Target Component 3 + * @param component4 Target Component 4 + * @returns Data associated with the components if it exists + */ + get( + id: number, + component: Entity, + component2: Entity, + component3: Entity, + component4: Entity + ): LuaTuple>; - /** - * Searches the world for entities that match a given query - * @param components Queried Components - * @returns Query - */ - query(...components: T): Query>; + /** + * Searches the world for entities that match a given query + * @param components Queried Components + * @returns Query + */ + query(...components: T): Query>; } /** @@ -176,4 +177,4 @@ export const OnAdd: Entity; export const OnRemove: Entity; export const OnSet: Entity; export const Wildcard: Entity; -export const Rest: Entity; \ No newline at end of file +export const Rest: Entity; diff --git a/src/init.luau b/src/init.luau index c7cccdd..c5f63e3 100644 --- a/src/init.luau +++ b/src/init.luau @@ -723,7 +723,6 @@ local Arm = function(self: Query, ...) end local world_query do - local EmptyQuery: Query = { __iter = function(): Item return noop @@ -1214,9 +1213,10 @@ export type Entity = number & { __DO_NOT_USE_OR_YOU_WILL_BE_FIRED: T } export type Pair = number export type QueryShim = typeof(setmetatable({ - without = function(...): QueryShim - return nil :: any - end, + without = noop :: (QueryShim, ...i53) -> QueryShim, + with = noop :: (QueryShim, ...i53) -> QueryShim, + drain = noop :: (QueryShim) -> QueryShim, + replace = noop :: (QueryShim, fn: (T...) -> T...) -> (), }, { __iter = function(): () -> (number, T...) return nil :: any