cell registry: use {dom, cat} as key to allow query by category

This commit is contained in:
Helmut Merz 2026-06-22 09:54:32 +02:00
parent eb0954eeee
commit d4f58655ca

View file

@ -19,10 +19,11 @@ defmodule Scopes.Core.Environ do
end end
def setup({state, proc}, init_seq, proc_env \\ &proc_env/2) do def setup({state, proc}, init_seq, proc_env \\ &proc_env/2) do
Registry.start_link(keys: :unique, name: cells()) Registry.start_link(keys: :duplicate, name: cells())
env_scope = {%State{init_seq: init_seq}, proc_env, [], self()} env_scope = {%State{init_seq: init_seq}, proc_env, [], self()}
env = Core.neuron(env_scope) env = Core.neuron(env_scope)
Actor.register(env, cells(), {:env, :c00}) #Actor.register(env, cells(), {:env, :c00})
register(env, {:env, :c00})
msg = Shape.create([:csys, :zero], data: %{addr: {:csys, :c00, "0-0"}}) msg = Shape.create([:csys, :zero], data: %{addr: {:csys, :c00, "0-0"}})
scope = {state, proc, [], env} scope = {state, proc, [], env}
Core.create(msg, scope) Core.create(msg, scope)
@ -43,7 +44,8 @@ defmodule Scopes.Core.Environ do
new = data.new new = data.new
addr = data[:addr] addr = data[:addr]
if addr do if addr do
Actor.register(new, cells(), addr) #Actor.register(new, cells(), addr)
register(new, addr)
end end
{step, seq} = List.pop_at(state.init_seq, 0) {step, seq} = List.pop_at(state.init_seq, 0)
state1 = %State{init_seq: seq} state1 = %State{init_seq: seq}
@ -55,15 +57,30 @@ defmodule Scopes.Core.Environ do
end end
# accessing cell registry # accessing cell registry
def register(cell, {dom, cat}) do
Actor.register(cell, cells(), {dom, cat})
end
def register(cell, {dom, cat, item}) do
Actor.register(cell, cells(), {dom, cat}, item)
end
def get_cells(addr) do
case addr do
{dom, cat, item} -> Registry.match(cells(), {dom, cat}, item)
_ -> Registry.lookup(cells(), addr)
end
end
def get_cell(addr) do def get_cell(addr) do
data = Registry.lookup(cells(), addr) cells = get_cells(addr)
if data do if cells == [] do
[{cell, _val}] = data
cell
else
Logger.warning "No cell found at address #{inspect(addr)}!" Logger.warning "No cell found at address #{inspect(addr)}!"
nil nil
else
[{cell, _val}] = cells
cell
end end
end end