From 649a65d85441edfd8b13f4da0f36f06f8424614e Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Sun, 27 Sep 2026 22:13:45 +0300 Subject: [PATCH] feat(ecs): things_now / things_changed - a consumer keeps the tick it read up to and asks only for the Things written since (untouched 64-row blocks skipped) Co-Authored-By: Claude Opus 5.5 --- packages/ludic.things/chunks.ludic | 17 +++++++++++++++++ packages/ludic.things/tests/things_test.ludic | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/packages/ludic.things/chunks.ludic b/packages/ludic.things/chunks.ludic index b545be70..d337f4ed 100644 --- a/packages/ludic.things/chunks.ludic +++ b/packages/ludic.things/chunks.ludic @@ -15,3 +15,20 @@ export function things_drop_chunk(things_st: mut ThingsState, chunk: int) -> int } return n } + +# change detection: the tick now, the table moving on to the next - a consumer keeps what this +# returned and asks things_changed(since: it) for what was written after +export function things_now(things_st: mut ThingsState) -> int { + let t = tb_tick(things_st.th.tab) + tb_advance(things_st.th.tab) + return t +} + +# every Thing a verb wrote after `since`, into the caller's list (untouched 64-row blocks skipped) +export function things_changed(things_st: ThingsState, since: int, rows: words, out: []Thing) -> int { + List.clear(out) + let tb = things_st.th.tab + let n = tb_changed_since(tb, since, rows) + for k in 0 .. n { push(out, tb.rec[rows[k]]) } + return n +} diff --git a/packages/ludic.things/tests/things_test.ludic b/packages/ludic.things/tests/things_test.ludic index b0338d55..11438c80 100644 --- a/packages/ludic.things/tests/things_test.ludic +++ b/packages/ludic.things/tests/things_test.ludic @@ -197,4 +197,22 @@ program ThingsTest { expect_eq(len(facts(things_st)), 3) expect_eq(things_verify(things_st), 0) } + + test "change detection names what a verb wrote since the tick a consumer kept" (things_st: mut ThingsState) { + things_clear(things_st) + let a = put(things_st, TH_BRANCH, 1.0, 0.0) + let b = put(things_st, TH_BRANCH, 2.0, 0.0) + let seen = things_now(things_st) + let rows = words(0) + let out = new []Thing + expect_eq(things_changed(things_st, seen, rows, out), 0) + thing_hide(b) + expect_eq(things_changed(things_st, seen, rows, out), 1) + expect(out[0] == b) + let later = things_now(things_st) + thing_move(a, 9.0, 9.0, 0.0) + expect_eq(things_changed(things_st, later, rows, out), 1) + expect(out[0] == a) + expect_eq(things_changed(things_st, seen, rows, out), 2) + } }