From ea110ea2a9c0bc49bcd816acd7e8cf4825e7f5c8 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Sat, 25 May 2024 21:32:27 +0200 Subject: [PATCH] Add replace function --- lib/init.lua | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/lib/init.lua b/lib/init.lua index 5cf38ea..cf3ccaf 100644 --- a/lib/init.lua +++ b/lib/init.lua @@ -657,7 +657,13 @@ setmetatable(EmptyQuery, EmptyQuery) export type Query = typeof(EmptyQuery) -function World.query(world: World, ...: i53): Query +local function replace(row, columns, ...) + for i, column in columns do + column[row] = select(i, ...) + end +end + +function World.query(world: World, ...): Query -- breaking? if (...) == nil then error("Missing components") @@ -750,6 +756,48 @@ function World.query(world: World, ...: i53): Query local lastRow local queryOutput = {} + + function preparedQuery:patch(fn: any) + for _, compatibleArchetype in compatibleArchetypes do + local archetype = compatibleArchetype.archetype + local tr = compatibleArchetype.indices + local columns = archetype.columns + + for row in archetype.entities do + if queryLength == 1 then + local a = columns[tr[1]] + local pa = fn(a[row]) + + a[row] = pa + elseif queryLength == 2 then + local a = columns[tr[1]] + local b = columns[tr[2]] + + a[row], b[row] = fn(a[row], b[row]) + elseif queryLength == 3 then + local a = columns[tr[1]] + local b = columns[tr[2]] + local c = columns[tr[3]] + + a[row], b[row], c[row] = fn(a[row], b[row], c[row]) + elseif queryLength == 4 then + local a = columns[tr[1]] + local b = columns[tr[2]] + local c = columns[tr[3]] + local d = columns[tr[4]] + + a[row], b[row], c[row], d[row] = fn( + a[row], b[row], c[row], d[row]) + else + for i = 1, queryLength do + queryOutput[i] = columns[tr[i]][row] + end + replace(row, columns, fn(unpack(queryOutput))) + end + end + end + end + function preparedQuery:__iter() return function() local archetype = compatibleArchetype.archetype