From fd124d682dae970010ae06c4ca124a5a0892e5d8 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Fri, 30 Jan 2026 01:44:13 +0100 Subject: [PATCH] Use type functions for query --- src/jecs.luau | 49 +++++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/src/jecs.luau b/src/jecs.luau index 84ba925..b82b37f 100755 --- a/src/jecs.luau +++ b/src/jecs.luau @@ -211,6 +211,23 @@ type world = { removed: (world, i53, (e: i53, id: i53, delete: boolean?) -> ()) -> () -> (), } +export type Type_Query = Query + +type function QueryBundle(t1: type) + assert(t1:is("function")) + local params = t1:returns() + local head = params.head + assert(head) + local newt = {} + for i = 1, #head do + if head[i] == types.unknown then + continue + end + newt[i] = head[i]:readproperty(types.singleton("__T")) + end + + return Type_Query(unpack(newt)) +end export type World = { archetype_edges: Map>, @@ -296,35 +313,7 @@ export type World = { children: (self: World, id: Id) -> () -> Entity, --- Searches the world for entities that match a given query - query: ((World) -> Query) - & ((World, Component) -> Query) - & ((World, Component, Component) -> Query) - & ((World, Component, Component, Component) -> Query) - & ((World, Component, Component, Component, Component) -> Query) - & ((World, Component, Component, Component, Component, Component) -> Query) - & ((World, Component, Component, Component, Component, Component, Component) -> Query) - & (( - World, - Component, - Component, - Component, - Component, - Component, - Component, - Component - ) -> Query) - & (( - World, - Component, - Component, - Component, - Component, - Component, - Component, - Component, - Component, - ...Component - ) -> Query), + query: ((World, A?, B?, C?, D?, E?, F?, G?, H?, ...Component) -> QueryBundle<() -> (A, B, C, D, E, F, G, H)>), } export type Record = { @@ -3229,7 +3218,7 @@ local function world_new(DEBUG: boolean?) return function() local n = #listeners - local i = table.find(listeners, fn) + local i = table.find(listeners, fn::Listener) listeners[i] = listeners[n] listeners[n] = nil end