Allow nil indexing in world:target (#131)

* Allow nil index in world:target

* Fix the fun type at the bottom

* Update tests
This commit is contained in:
EncodedVenom 2024-09-23 08:29:53 -04:00 committed by GitHub
parent 68729446d0
commit 16e8055983
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 2 deletions

10
src/index.d.ts vendored
View file

@ -95,11 +95,21 @@ export class World {
* Gets the target of a relationship. For example, when a user calls * Gets the target of a relationship. For example, when a user calls
* `world.target(entity, ChildOf(parent))`, you will obtain the parent entity. * `world.target(entity, ChildOf(parent))`, you will obtain the parent entity.
* @param entity Entity * @param entity Entity
* @param index Target index
* @param relation The Relationship * @param relation The Relationship
* @returns The Parent Entity if it exists * @returns The Parent Entity if it exists
*/ */
target(entity: Entity, relation: Entity, index: number): Entity | undefined; target(entity: Entity, relation: Entity, index: number): Entity | undefined;
/**
* Gets the target of a relationship. For example, when a user calls
* `world.target(entity, ChildOf(parent))`, you will obtain the parent entity.
* @param entity Entity
* @param relation The Relationship
* @returns The Parent Entity if it exists
*/
target(entity: Entity, relation: Entity): Entity | undefined;
/** /**
* Clears an entity from the world. * Clears an entity from the world.
* @param entity Entity to be cleared * @param entity Entity to be cleared

View file

@ -389,7 +389,8 @@ local function world_has(world: World, entity: number, ...: i53): boolean
return true return true
end end
local function world_target(world: World, entity: i53, relation: i24, index: number): i24? local function world_target(world: World, entity: i53, relation: i24, index_opt: number?): i24?
local index = if index_opt then index_opt else 0
local record = world.entityIndex.sparse[entity] local record = world.entityIndex.sparse[entity]
local archetype = record.archetype local archetype = record.archetype
if not archetype then if not archetype then
@ -1812,7 +1813,7 @@ export type World = {
component: <T>(self: World) -> Entity<T>, component: <T>(self: World) -> Entity<T>,
--- Gets the target of an relationship. For example, when a user calls --- Gets the target of an relationship. For example, when a user calls
--- `world:target(id, ChildOf(parent), 0)`, you will obtain the parent entity. --- `world:target(id, ChildOf(parent), 0)`, you will obtain the parent entity.
target: (self: World, id: Entity, relation: Entity, nth: number) -> Entity?, target: (self: World, id: Entity, relation: Entity, nth: number?) -> Entity?,
--- Deletes an entity and all it's related components and relationships. --- Deletes an entity and all it's related components and relationships.
delete: (self: World, id: Entity) -> (), delete: (self: World, id: Entity) -> (),

View file

@ -1012,6 +1012,25 @@ TEST("world:target", function()
CHECK(world:target(e, C, 1) == nil) CHECK(world:target(e, C, 1) == nil)
end end
do CASE "infer index when unspecified"
local world = world_new()
local A = world:component()
local B = world:component()
local C = world:component()
local D = world:component()
local e = world:entity()
world:add(e, pair(A, B))
world:add(e, pair(A, C))
world:add(e, pair(B, C))
world:add(e, pair(B, D))
world:add(e, pair(C, D))
CHECK(world:target(e, A) == world:target(e, A, 0))
CHECK(world:target(e, B) == world:target(e, B, 0))
CHECK(world:target(e, C) == world:target(e, C, 0))
end
do CASE "loop until no target" do CASE "loop until no target"
local world = world_new() local world = world_new()