mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-11-04 02:49:18 +00:00 
			
		
		
		
	Initial commit with union
This commit is contained in:
		
							parent
							
								
									dab260f733
								
							
						
					
					
						commit
						46d363ad5f
					
				
					 3 changed files with 24 additions and 13 deletions
				
			
		
							
								
								
									
										12
									
								
								jecs.luau
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								jecs.luau
									
									
									
									
									
								
							| 
						 | 
					@ -2525,8 +2525,8 @@ end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
World.new = world_new
 | 
					World.new = world_new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type Entity<T = any> = { __T: T }
 | 
					export type Entity<T = any> = number | { __T: T }
 | 
				
			||||||
export type Id<T = any> = { __T: T }
 | 
					export type Id<T = any> = number | { __T: T }
 | 
				
			||||||
export type Pair<P, O> = Id<P>
 | 
					export type Pair<P, O> = Id<P>
 | 
				
			||||||
type ecs_id_t<T=unknown> = Id<T> | Pair<T, "Tag"> | Pair<"Tag", T>
 | 
					type ecs_id_t<T=unknown> = Id<T> | Pair<T, "Tag"> | Pair<"Tag", T>
 | 
				
			||||||
export type Item<T...> = (self: Query<T...>) -> (Entity, T...)
 | 
					export type Item<T...> = (self: Query<T...>) -> (Entity, T...)
 | 
				
			||||||
| 
						 | 
					@ -2601,10 +2601,10 @@ export type World = {
 | 
				
			||||||
		& (<T, a, b, c, d>(World, Entity<T>, Id<a>, Id<b>, Id<c>, Id<d>) -> (a?, b?, c?, d?)),
 | 
							& (<T, a, b, c, d>(World, Entity<T>, Id<a>, Id<b>, Id<c>, Id<d>) -> (a?, b?, c?, d?)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	--- Returns whether the entity has the ID.
 | 
						--- Returns whether the entity has the ID.
 | 
				
			||||||
	has: (<T>(World, Entity<T>, Id) -> boolean)
 | 
						has: (<T, a>(World, Entity<T>, Id<a>) -> boolean)
 | 
				
			||||||
		& (<T>(World, Entity<T>, Id, Id) -> boolean)
 | 
							& (<T, a, b >(World, Entity<T>, Id<a>, Id<a>) -> boolean)
 | 
				
			||||||
		& (<T>(World, Entity<T>, Id, Id, Id) -> boolean)
 | 
							& (<T, a, b, c>(World, Entity<T>, Id<a>, Id<b>, Id<c>) -> boolean)
 | 
				
			||||||
		& <T>(World, Entity<T>, Id, Id, Id, Id) -> boolean,
 | 
							& <T, a, b, c, d>(World, Entity<T>, Id<a>, Id<b>, Id<c>, Id<d>) -> boolean,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	--- Get parent (target of ChildOf relationship) for entity. If there is no ChildOf relationship pair, it will return nil.
 | 
						--- Get parent (target of ChildOf relationship) for entity. If there is no ChildOf relationship pair, it will return nil.
 | 
				
			||||||
	parent: <T>(self: World, entity: Entity<T>) -> Entity,
 | 
						parent: <T>(self: World, entity: Entity<T>) -> Entity,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,17 @@ local observers_add = require("@addons/observers")
 | 
				
			||||||
TEST("addons/observers", function()
 | 
					TEST("addons/observers", function()
 | 
				
			||||||
	local world = observers_add(jecs.world())
 | 
						local world = observers_add(jecs.world())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local Test = world:component() :: jecs.Id<number>
 | 
				
			||||||
 | 
						type Q<T...> = () -> (jecs.Entity, T...)
 | 
				
			||||||
 | 
						local query:
 | 
				
			||||||
 | 
							(<A>(jecs.World, jecs.Id<A>) -> Q<A>)
 | 
				
			||||||
 | 
							& (<A, B>(jecs.World, jecs.Id<A>, jecs.Id<B>) -> Q<A, B>)
 | 
				
			||||||
 | 
							& (<A, B, C>(jecs.World, jecs.Id<A>, jecs.Id<B>, jecs.Id<C>) -> Q<A, B, C>)
 | 
				
			||||||
 | 
							= 1 :: never
 | 
				
			||||||
 | 
						for e, a in query(world, Test) do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do CASE "Should work even if set after the component has been used"
 | 
						do CASE "Should work even if set after the component has been used"
 | 
				
			||||||
		local A = world:component()
 | 
							local A = world:component()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -661,7 +661,7 @@ TEST("world:range()", function()
 | 
				
			||||||
	do CASE "under range start"
 | 
						do CASE "under range start"
 | 
				
			||||||
		local world = jecs.world()
 | 
							local world = jecs.world()
 | 
				
			||||||
		world:range(400, 1000)
 | 
							world:range(400, 1000)
 | 
				
			||||||
		local id = world:entity()
 | 
							local id = world:entity() :: number
 | 
				
			||||||
		local e = world:entity(id + 5)
 | 
							local e = world:entity(id + 5)
 | 
				
			||||||
		CHECK(e == id + 5)
 | 
							CHECK(e == id + 5)
 | 
				
			||||||
		CHECK(world:contains(e))
 | 
							CHECK(world:contains(e))
 | 
				
			||||||
| 
						 | 
					@ -669,7 +669,7 @@ TEST("world:range()", function()
 | 
				
			||||||
		CHECK(world:contains(e2))
 | 
							CHECK(world:contains(e2))
 | 
				
			||||||
		world:delete(e2)
 | 
							world:delete(e2)
 | 
				
			||||||
		CHECK(not world:contains(e2))
 | 
							CHECK(not world:contains(e2))
 | 
				
			||||||
		local e2v1 = world:entity(399)
 | 
							local e2v1 = world:entity(399) :: number
 | 
				
			||||||
		CHECK(world:contains(e2v1))
 | 
							CHECK(world:contains(e2v1))
 | 
				
			||||||
		CHECK(ECS_ID(e2v1) == 399)
 | 
							CHECK(ECS_ID(e2v1) == 399)
 | 
				
			||||||
		CHECK(ECS_GENERATION(e2v1) == 0)
 | 
							CHECK(ECS_GENERATION(e2v1) == 0)
 | 
				
			||||||
| 
						 | 
					@ -682,13 +682,13 @@ TEST("world:range()", function()
 | 
				
			||||||
		CHECK(world:contains(e2))
 | 
							CHECK(world:contains(e2))
 | 
				
			||||||
		world:delete(e2)
 | 
							world:delete(e2)
 | 
				
			||||||
		CHECK(not world:contains(e2))
 | 
							CHECK(not world:contains(e2))
 | 
				
			||||||
		local e2v1 = world:entity(405)
 | 
							local e2v1 = world:entity(405) :: number
 | 
				
			||||||
		CHECK(world:contains(e2v1))
 | 
							CHECK(world:contains(e2v1))
 | 
				
			||||||
		CHECK(ECS_ID(e2v1) == 405)
 | 
							CHECK(ECS_ID(e2v1) == 405)
 | 
				
			||||||
		CHECK(ECS_GENERATION(e2v1) == 0)
 | 
							CHECK(ECS_GENERATION(e2v1) == 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		world:delete(e2v1)
 | 
							world:delete(e2v1)
 | 
				
			||||||
		local e2v2 = world:entity(e2v1)
 | 
							local e2v2 = world:entity(e2v1) :: number
 | 
				
			||||||
		CHECK(ECS_ID(e2v2) == 405)
 | 
							CHECK(ECS_ID(e2v2) == 405)
 | 
				
			||||||
		CHECK(ECS_GENERATION(e2v2) == 0)
 | 
							CHECK(ECS_GENERATION(e2v2) == 0)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
| 
						 | 
					@ -697,7 +697,7 @@ end)
 | 
				
			||||||
TEST("world:entity()", function()
 | 
					TEST("world:entity()", function()
 | 
				
			||||||
	do CASE "desired id"
 | 
						do CASE "desired id"
 | 
				
			||||||
		local world = jecs.world()
 | 
							local world = jecs.world()
 | 
				
			||||||
		local id = world:entity()
 | 
							local id = world:entity() :: number
 | 
				
			||||||
		local e = world:entity(id + 5)
 | 
							local e = world:entity(id + 5)
 | 
				
			||||||
		CHECK(e == id + 5)
 | 
							CHECK(e == id + 5)
 | 
				
			||||||
		CHECK(world:contains(e))
 | 
							CHECK(world:contains(e))
 | 
				
			||||||
| 
						 | 
					@ -767,11 +767,11 @@ TEST("world:entity()", function()
 | 
				
			||||||
			local e = world:entity()
 | 
								local e = world:entity()
 | 
				
			||||||
			world:delete(e)
 | 
								world:delete(e)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		local e = world:entity() :: any
 | 
							local e = world:entity() :: number
 | 
				
			||||||
		CHECK(ECS_ID(e) == pin)
 | 
							CHECK(ECS_ID(e) == pin)
 | 
				
			||||||
		CHECK(ECS_GENERATION(e) == 2^16-1)
 | 
							CHECK(ECS_GENERATION(e) == 2^16-1)
 | 
				
			||||||
		world:delete(e)
 | 
							world:delete(e)
 | 
				
			||||||
		e = world:entity()
 | 
							e = world:entity() :: number
 | 
				
			||||||
		CHECK(ECS_ID(e) == pin)
 | 
							CHECK(ECS_ID(e) == pin)
 | 
				
			||||||
		CHECK(ECS_GENERATION(e) == 0)
 | 
							CHECK(ECS_GENERATION(e) == 0)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue