Compare commits

...

7 commits

Author SHA1 Message Date
Ukendio
23540e5919 Make iterators simple functions
Some checks are pending
analysis / Run Luau Analyze (push) Waiting to run
deploy-docs / build (push) Waiting to run
deploy-docs / Deploy (push) Blocked by required conditions
publish-npm / publish (push) Waiting to run
unit-testing / Run Luau Tests (push) Waiting to run
2025-07-06 09:52:09 +02:00
Ukendio
169ec09ed5 Change monitor to be iterable 2025-07-06 09:48:13 +02:00
Ukendio
a9891abf6d Make callback optional 2025-07-06 09:42:49 +02:00
Ukendio
6dfb428296 Updated observers 2025-07-06 09:33:31 +02:00
Ukendio
b92cf9ab76 Bump versions 2025-07-06 08:52:17 +02:00
Ukendio
5aedb5e730 Bump wally 2025-07-06 08:51:10 +02:00
Ukendio
1c524f1587 Update TS types 2025-07-06 08:49:10 +02:00
4 changed files with 51 additions and 21 deletions

View file

@ -4,15 +4,15 @@ export type PatchedWorld = jecs.World & {
added: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (), added: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (),
removed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id) -> ()) -> () -> (), removed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id) -> ()) -> () -> (),
changed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (), changed: <T>(PatchedWorld, jecs.Id<T>, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (),
observer: ( observer: <T...>(
PatchedWorld, PatchedWorld,
any, jecs.Query<T...>,
(jecs.Entity) -> () (<a>(jecs.Entity, jecs.Id<a>, a) -> ())?
) -> (), ) -> () -> (jecs.Entity),
monitor: ( monitor: (
PatchedWorld, PatchedWorld,
any, any,
(jecs.Entity, jecs.Id) -> () (<a>(jecs.Entity, jecs.Id<a>) -> ())?
) -> () ) -> ()
} }
@ -25,6 +25,8 @@ local function observers_new(world, query, callback)
end end
local entity_index = world.entity_index :: any local entity_index = world.entity_index :: any
local i = 0
local entities = {}
local function emplaced(entity, id, value) local function emplaced(entity, id, value)
local r = jecs.entity_index_try_get_fast( local r = jecs.entity_index_try_get_fast(
entity_index, entity :: any) entity_index, entity :: any)
@ -36,7 +38,11 @@ local function observers_new(world, query, callback)
local archetype = r.archetype local archetype = r.archetype
if jecs.query_match(query, archetype) then if jecs.query_match(query, archetype) then
callback(entity) i += 1
entities[i] = entity
if callback ~= nil then
callback(entity, id, value)
end
end end
end end
@ -44,6 +50,19 @@ local function observers_new(world, query, callback)
world:added(term, emplaced) world:added(term, emplaced)
world:changed(term, emplaced) world:changed(term, emplaced)
end end
return function()
local row = i
return function()
if row == 0 then
i = 0
table.clear(entities)
end
local entity = entities[row]
row -= 1
return entity
end
end
end end
local function join(world, component) local function join(world, component)
@ -99,7 +118,9 @@ local function monitors_new(world, query, callback)
end end
local entity_index = world.entity_index :: any local entity_index = world.entity_index :: any
local function emplaced(entity: jecs.Entity) local i = 0
local entities = {}
local function emplaced(entity, id, value)
local r = jecs.entity_index_try_get_fast( local r = jecs.entity_index_try_get_fast(
entity_index, entity :: any) entity_index, entity :: any)
@ -110,22 +131,17 @@ local function monitors_new(world, query, callback)
local archetype = r.archetype local archetype = r.archetype
if jecs.query_match(query, archetype) then if jecs.query_match(query, archetype) then
callback(entity, jecs.OnAdd) i += 1
entities[i] = entity
if callback ~= nil then
callback(entity, id, value)
end
end end
end end
local function removed(entity: jecs.Entity, component: jecs.Id) local function removed(entity: jecs.Entity, component: jecs.Id)
local r = jecs.entity_index_try_get_fast( local EcsOnRemove = jecs.OnRemove :: jecs.Id
entity_index, entity :: any) if callback ~= nil then
if not r then
return
end
local archetype = r.archetype
if jecs.query_match(query, archetype) then
local EcsOnRemove = jecs.OnRemove :: jecs.Id
callback(entity, EcsOnRemove) callback(entity, EcsOnRemove)
end end
end end
@ -134,6 +150,19 @@ local function monitors_new(world, query, callback)
world:added(term, emplaced) world:added(term, emplaced)
world:removed(term, removed) world:removed(term, removed)
end end
return function()
local row = i
return function()
if row == 0 then
i = 0
table.clear(entities)
end
local entity = entities[row]
row -= 1
return entity
end
end
end end
local function observers_add(world: jecs.World): PatchedWorld local function observers_add(world: jecs.World): PatchedWorld

1
jecs.d.ts vendored
View file

@ -310,6 +310,7 @@ export declare const OnDeleteTarget: Tag;
export declare const Delete: Tag; export declare const Delete: Tag;
export declare const Remove: Tag; export declare const Remove: Tag;
export declare const Name: Entity<string>; export declare const Name: Entity<string>;
export declare const Exclusive: Tag;
export declare const Rest: Entity; export declare const Rest: Entity;
export type ComponentRecord = { export type ComponentRecord = {

View file

@ -1,6 +1,6 @@
{ {
"name": "@rbxts/jecs", "name": "@rbxts/jecs",
"version": "0.7.3", "version": "0.8.1",
"description": "Stupidly fast Entity Component System", "description": "Stupidly fast Entity Component System",
"main": "jecs.luau", "main": "jecs.luau",
"repository": { "repository": {

View file

@ -1,6 +1,6 @@
[package] [package]
name = "ukendio/jecs" name = "ukendio/jecs"
version = "0.7.3" version = "0.8.1"
registry = "https://github.com/UpliftGames/wally-index" registry = "https://github.com/UpliftGames/wally-index"
realm = "shared" realm = "shared"
license = "MIT" license = "MIT"