diff --git a/.luaurc b/.luaurc index d1ae244..5518c4c 100644 --- a/.luaurc +++ b/.luaurc @@ -4,6 +4,7 @@ "testkit": "tools/testkit", "mirror": "mirror", "tools": "tools", + "addons": "addons", }, "languageMode": "strict" } diff --git a/tools/entity_visualiser.luau b/addons/entity_visualiser.luau similarity index 66% rename from tools/entity_visualiser.luau rename to addons/entity_visualiser.luau index 69dc910..f3c3c7e 100644 --- a/tools/entity_visualiser.luau +++ b/addons/entity_visualiser.luau @@ -1,7 +1,40 @@ local jecs = require("@jecs") local ECS_GENERATION = jecs.ECS_GENERATION local ECS_ID = jecs.ECS_ID -local ansi = require("@tools/ansi") + +local ansi = { + white_underline = function(s: any) + return `\27[1;4m{s}\27[0m` + end, + + white = function(s: any) + return `\27[37;1m{s}\27[0m` + end, + + green = function(s: any) + return `\27[32;1m{s}\27[0m` + end, + + red = function(s: any) + return `\27[31;1m{s}\27[0m` + end, + + yellow = function(s: any) + return `\27[33;1m{s}\27[0m` + end, + + red_highlight = function(s: any) + return `\27[41;1;30m{s}\27[0m` + end, + + green_highlight = function(s: any) + return `\27[42;1;30m{s}\27[0m` + end, + + gray = function(s: any) + return `\27[30;1m{s}\27[0m` + end, +} local function pe(e: any) local gen = ECS_GENERATION(e) diff --git a/tools/lifetime_tracker.luau b/addons/lifetime_tracker.luau similarity index 93% rename from tools/lifetime_tracker.luau rename to addons/lifetime_tracker.luau index c9abbbf..54d9ee9 100644 --- a/tools/lifetime_tracker.luau +++ b/addons/lifetime_tracker.luau @@ -4,10 +4,9 @@ local ECS_ID = jecs.ECS_ID local __ = jecs.Wildcard local pair = jecs.pair -local prettify = require("@tools/entity_visualiser").prettify +local prettify = require("@addons/entity_visualiser").prettify local pe = prettify -local ansi = require("@tools/ansi") function print_centered_entity(entity, width: number) local entity_str = tostring(entity) @@ -40,12 +39,10 @@ local function lifetime_tracker_add(world: jecs.World, opt) local ENTITY_RANGE = (jecs.Rest :: any) + 1 - local w = setmetatable({}, { __index = world }) - padding_enabled = opt.padding_enabled local world_entity = world.entity - w.entity = function(self, entity) + world.entity = function(_, entity) if entity then return world_entity(world, entity) end @@ -59,7 +56,7 @@ local function lifetime_tracker_add(world: jecs.World, opt) pad() return e end - w.print_entity_index = function(self) + world.print_entity_index = function() local max_id = entity_index.max_id local alive_count = entity_index.alive_count local alive = table.move(dense_array, 1 + jecs.Rest :: any, alive_count, 1, {}) @@ -86,7 +83,7 @@ local function lifetime_tracker_add(world: jecs.World, opt) pad() end local timelines = {} - w.print_snapshot = function(self) + world.print_snapshot = function(_) local timeline = #timelines + 1 local entity_column_width = 10 local status_column_width = 8 @@ -161,7 +158,7 @@ local function lifetime_tracker_add(world: jecs.World, opt) end local world_add = world.add local relations = {} - w.add = function(self, entity: any, component: any) + world.add = function(_, entity: any, component: any) world_add(world, entity, component) if jecs.IS_PAIR(component) then local relation = jecs.pair_first(world, component) @@ -172,7 +169,7 @@ local function lifetime_tracker_add(world: jecs.World, opt) end local world_delete = world.delete - w.delete = function(self, e) + world.delete = function(world, e) world_delete(world, e) local idr_t = component_index[pair(__, e)] @@ -210,7 +207,7 @@ local function lifetime_tracker_add(world: jecs.World, opt) print(`*deleted {pe(e)}`) pad() end - return w + return world end return lifetime_tracker_add diff --git a/tools/observers.luau b/addons/observers.luau similarity index 72% rename from tools/observers.luau rename to addons/observers.luau index 6090adf..9afad4e 100644 --- a/tools/observers.luau +++ b/addons/observers.luau @@ -1,11 +1,9 @@ local jecs = require("@jecs") local testkit = require("@testkit") -local function observers_new(description) - local event = description.event +local function observers_new(world, description) local query = description.query local callback = description.callback - local world = query.world local terms = query.filter_with if not terms then local ids = query.ids @@ -26,11 +24,8 @@ local function observers_new(description) end for _, term in terms do - if event == jecs.OnAdd then - world:added(term, emplaced) - elseif event == jecs.OnSet then - world:emplaced(term, emplaced) - end + world:added(term, emplaced) + world:changed(term, emplaced) end end @@ -67,12 +62,11 @@ local function world_track(world, ...) for _, term in terms do world:added(term, emplaced) - world:emplaced(term, emplaced) + world:changed(term, emplaced) end local function iter() local i = n - print(i, "i") return function() local row = i if row == 0 then @@ -84,12 +78,16 @@ local function world_track(world, ...) end local it = { - __iter = iter + __iter = iter, + without = function(self, ...) + q_shim.filter_without = { ... } + return self + end } return setmetatable(it, it) end -local function observers_init(world) +local function observers_add(world) local signals = { added = {}, emplaced = {}, @@ -110,13 +108,13 @@ local function observers_init(world) table.insert(listeners, fn) end - world.emplaced = function(_, component, fn) + world.changed = function(_, component, fn) local listeners = signals.emplaced[component] if not listeners then listeners = {} signals.emplaced[component] = listeners local idr = jecs.id_record_ensure(world, component) - idr.hooks.on_set = function(entity, value) + idr.hooks.on_change = function(entity, value) for _, listener in listeners do listener(entity, value) end @@ -143,46 +141,9 @@ local function observers_init(world) world.signals = signals world.track = world_track - return + + world.observer = observers_new + return world end -local world = jecs.world() -observers_init(world) - -local A = world:component() -local B = world:component() - -world:added(A, print) -world:added(A, function(entity) - print(entity, 2) -end) - -local observer = observers_new({ - event = jecs.OnAdd, - query = world:query(A, B), - callback = function(entity) - print(entity, 3) - end -}) - -local e = world:entity() -local Test = world:track(A, B) -for a in Test do - print(a) - assert(false) -end -world:add(e, A) - --- Output: --- 271 --- 271, 2 -for _ in Test do - assert(false) -end -world:add(e, B) -for a in Test do - print("lol") - assert(true) -end --- Output: --- 271, 3 +return observers_add diff --git a/test/devtools_test.luau b/test/addons/entity_visualiser.luau similarity index 83% rename from test/devtools_test.luau rename to test/addons/entity_visualiser.luau index 31ed1df..e011041 100644 --- a/test/devtools_test.luau +++ b/test/addons/entity_visualiser.luau @@ -1,8 +1,7 @@ local jecs = require("@jecs") local pair = jecs.pair local ChildOf = jecs.ChildOf -local lifetime_tracker_add = require("@tools/lifetime_tracker") -local pe = require("@tools/entity_visualiser").prettify +local lifetime_tracker_add = require("@addons/lifetime_tracker") local world = lifetime_tracker_add(jecs.world(), {padding_enabled=false}) local FriendsWith = world:component() world:print_snapshot() diff --git a/test/addons/observers.luau b/test/addons/observers.luau new file mode 100644 index 0000000..616f5e9 --- /dev/null +++ b/test/addons/observers.luau @@ -0,0 +1,46 @@ +local jecs = require("@jecs") +local observers_add = require("@addons/observers") + +local world = jecs.world() +observers_add(world) + +local A = world:component() +local B = world:component() +local C = world:component() + +world:observer({ + query = world:query(), + callback = function(entity) + buf ..= debug.info(2, "sl") + end +}) + +local i = 0 +world:added(A, function(entity) + assert(i == 0) + i += 1 +end) +world:added(A, function(entity) + assert(i == 1) + i += 1 +end) + +world:removed(A, function(entity) + assert(false) +end) + +local observer = world:observer({ + query = world:query(A, B), + callback = function(entity) + assert(i == 2) + i += 1 + end +}) + + +local e = world:entity() +world:add(e, A) +assert(i == 2) + +world:add(e, B) +assert(i == 3) diff --git a/test/tests.luau b/test/tests.luau index 002b4af..ce0f9fd 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -133,6 +133,8 @@ TEST("#adding a recycled target", function() end) +local entity_visualizer = require("@addons/entity_visualiser") + TEST("#repro2", function() local world = world_new() local Lifetime = world:component() :: jecs.Id @@ -144,7 +146,6 @@ TEST("#repro2", function() world:set(entity, pair(Lifetime, Beam), 2) world:set(entity, pair(4, 5), 6) -- noise - local entity_visualizer = require("@tools/entity_visualiser") -- entity_visualizer.components(world, entity) for e in world:each(pair(Lifetime, __)) do @@ -169,7 +170,7 @@ TEST("#repro2", function() CHECK(world:get(entity, pair(Lifetime, Beam)) == 1) end) -local lifetime_tracker_add = require("@tools/lifetime_tracker") +local lifetime_tracker_add = require("@addons/lifetime_tracker") TEST("another", function() local world = world_new() @@ -306,8 +307,8 @@ TEST("world:cleanup()", function() CHECK(#archetype_index["1_2_3"].entities == 1) end) -local pe = require("@tools/entity_visualiser").prettify -local lifetime_tracker_add = require("@tools/lifetime_tracker") +local pe = require("@addons/entity_visualiser").prettify +local lifetime_tracker_add = require("@addons/lifetime_tracker") TEST("world:entity()", function() do diff --git a/tools/ansi.luau b/tools/ansi.luau deleted file mode 100644 index a391f8e..0000000 --- a/tools/ansi.luau +++ /dev/null @@ -1,33 +0,0 @@ -return { - white_underline = function(s: any) - return `\27[1;4m{s}\27[0m` - end, - - white = function(s: any) - return `\27[37;1m{s}\27[0m` - end, - - green = function(s: any) - return `\27[32;1m{s}\27[0m` - end, - - red = function(s: any) - return `\27[31;1m{s}\27[0m` - end, - - yellow = function(s: any) - return `\27[33;1m{s}\27[0m` - end, - - red_highlight = function(s: any) - return `\27[41;1;30m{s}\27[0m` - end, - - green_highlight = function(s: any) - return `\27[42;1;30m{s}\27[0m` - end, - - gray = function(s: any) - return `\27[30;1m{s}\27[0m` - end, -}