mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-11-04 02:49:18 +00:00 
			
		
		
		
	Fix contrived bug with observer
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	
This commit is contained in:
		
							parent
							
								
									5dba6e7bac
								
							
						
					
					
						commit
						bb03e88d3d
					
				
					 1 changed files with 33 additions and 30 deletions
				
			
		| 
						 | 
					@ -2,15 +2,20 @@ local jecs = require("@jecs")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Observer = {
 | 
					type Observer = {
 | 
				
			||||||
	callback: (jecs.Entity) -> (),
 | 
						callback: (jecs.Entity) -> (),
 | 
				
			||||||
	query: jecs.Query<...jecs.Id>,
 | 
						query: jecs.Query<...any>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Monitor = {
 | 
				
			||||||
 | 
						callback: (jecs.Entity, jecs.Entity) -> (),
 | 
				
			||||||
 | 
						queyr: jecs.Query<any>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type PatchedWorld = jecs.World & {
 | 
					export type PatchedWorld = jecs.World & {
 | 
				
			||||||
	added: <T>(PatchedWorld, jecs.Id<T>, (jecs.Entity, jecs.Id, T) -> ()) -> () -> (),
 | 
						added: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (),
 | 
				
			||||||
	removed: <T>(PatchedWorld, jecs.Id<T>, (jecs.Entity, jecs.Id) -> ()) -> () -> (),
 | 
						removed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id) -> ()) -> () -> (),
 | 
				
			||||||
	changed: <T>(PatchedWorld, jecs.Id<T>, (jecs.Entity, jecs.Id, T) -> ()) -> () -> (),
 | 
						changed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (),
 | 
				
			||||||
	observer: (PatchedWorld, Observer) -> (),
 | 
						observer: (PatchedWorld, Observer) -> (),
 | 
				
			||||||
	monitor: (PatchedWorld, Observer) -> (),
 | 
						monitor: (PatchedWorld, Monitor) -> (),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function observers_new(world, description)
 | 
					local function observers_new(world, description)
 | 
				
			||||||
| 
						 | 
					@ -45,7 +50,6 @@ local function observers_new(world, description)
 | 
				
			||||||
 	end
 | 
					 	end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
local function join(world, component)
 | 
					local function join(world, component)
 | 
				
			||||||
	local sparse_array = {}
 | 
						local sparse_array = {}
 | 
				
			||||||
	local dense_array = {}
 | 
						local dense_array = {}
 | 
				
			||||||
| 
						 | 
					@ -163,17 +167,17 @@ local function observers_add(world: jecs.World): PatchedWorld
 | 
				
			||||||
					listener(entity, id, value)
 | 
										listener(entity, id, value)
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
 | 
								local existing_hook = world:get(component, jecs.OnAdd)
 | 
				
			||||||
 | 
								if existing_hook then
 | 
				
			||||||
 | 
									table.insert(listeners, existing_hook)
 | 
				
			||||||
				local idr = world.component_index[component]
 | 
									local idr = world.component_index[component]
 | 
				
			||||||
				if idr then
 | 
									if idr then
 | 
				
			||||||
				local idr_hook_existing = idr.hooks.on_add
 | 
										idr.hooks.on_add = on_add
 | 
				
			||||||
				if idr_hook_existing then
 | 
					 | 
				
			||||||
					table.insert(listeners, idr_hook_existing)
 | 
					 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
				idr.hooks.on_add = on_add :: any
 | 
								end
 | 
				
			||||||
			else
 | 
					
 | 
				
			||||||
			world:set(component, jecs.OnAdd, on_add)
 | 
								world:set(component, jecs.OnAdd, on_add)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		table.insert(listeners, fn)
 | 
							table.insert(listeners, fn)
 | 
				
			||||||
		return function()
 | 
							return function()
 | 
				
			||||||
			local n = #listeners
 | 
								local n = #listeners
 | 
				
			||||||
| 
						 | 
					@ -197,17 +201,16 @@ local function observers_add(world: jecs.World): PatchedWorld
 | 
				
			||||||
					listener(entity, id, value)
 | 
										listener(entity, id, value)
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
 | 
								local existing_hook = world:get(component, jecs.OnChange)
 | 
				
			||||||
 | 
								if existing_hook then
 | 
				
			||||||
 | 
									table.insert(listeners, existing_hook)
 | 
				
			||||||
				local idr = world.component_index[component]
 | 
									local idr = world.component_index[component]
 | 
				
			||||||
				if idr then
 | 
									if idr then
 | 
				
			||||||
				local idr_hook_existing = idr.hooks.on_change
 | 
										idr.hooks.on_change = on_change
 | 
				
			||||||
				if idr_hook_existing then
 | 
									end
 | 
				
			||||||
					table.insert(listeners, idr_hook_existing)
 | 
					 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
				idr.hooks.on_change = on_change :: any
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
			world:set(component, jecs.OnChange, on_change)
 | 
								world:set(component, jecs.OnChange, on_change)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		table.insert(listeners, fn)
 | 
							table.insert(listeners, fn)
 | 
				
			||||||
		return function()
 | 
							return function()
 | 
				
			||||||
			local n = #listeners
 | 
								local n = #listeners
 | 
				
			||||||
| 
						 | 
					@ -231,17 +234,17 @@ local function observers_add(world: jecs.World): PatchedWorld
 | 
				
			||||||
					listener(entity, id, value)
 | 
										listener(entity, id, value)
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
 | 
								local existing_hook = world:get(component, jecs.OnRemove)
 | 
				
			||||||
 | 
								if existing_hook then
 | 
				
			||||||
 | 
									table.insert(listeners, existing_hook)
 | 
				
			||||||
				local idr = world.component_index[component]
 | 
									local idr = world.component_index[component]
 | 
				
			||||||
				if idr then
 | 
									if idr then
 | 
				
			||||||
				local idr_hook_existing = idr.hooks.on_remove
 | 
										idr.hooks.on_remove = on_remove
 | 
				
			||||||
				if idr_hook_existing then
 | 
					 | 
				
			||||||
					table.insert(listeners, idr_hook_existing)
 | 
					 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
				idr.hooks.on_remove = on_remove :: any
 | 
								end
 | 
				
			||||||
			else
 | 
					
 | 
				
			||||||
			world:set(component, jecs.OnRemove, on_remove)
 | 
								world:set(component, jecs.OnRemove, on_remove)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
		table.insert(listeners, fn)
 | 
							table.insert(listeners, fn)
 | 
				
			||||||
		return function()
 | 
							return function()
 | 
				
			||||||
			local n = #listeners
 | 
								local n = #listeners
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue