get rid of Environ.State.cells: just use cell registry

This commit is contained in:
Helmut Merz 2026-06-21 14:59:07 +02:00
parent 8919d99cbc
commit 4ec4b62a59
2 changed files with 20 additions and 38 deletions

View file

@ -8,7 +8,7 @@ defmodule Scopes.Core.Environ do
require Logger require Logger
defmodule State do defmodule State do
defstruct [cells: %{}, init_seq: []] defstruct [init_seq: []]
end end
def cells(), do: @cell_registry def cells(), do: @cell_registry
@ -30,11 +30,11 @@ defmodule Scopes.Core.Environ do
:ignore :ignore
end end
def proc_env(msg, scope = {state, _proc, _syns, env}) do def proc_env(msg, scope) do
case Shape.head(msg) do case Shape.head(msg) do
{:exec, func} -> func.(state) {:exec, func} -> func.()
[:csys, :created | _rest] -> process_created(msg, scope) [:csys, :created | _rest] -> process_created(msg, scope)
_ -> send(env, msg) # forward message to application _ -> send(Core.env(scope), msg) # forward message to application
end end
end end
@ -42,20 +42,14 @@ defmodule Scopes.Core.Environ do
data = Shape.data(msg) data = Shape.data(msg)
new = data.new new = data.new
addr = data[:addr] addr = data[:addr]
cells = if addr do if addr do
Actor.register(new, cells(), addr) Actor.register(new, cells(), addr)
{dom, cat, item} = addr
Map.update(state.cells, {dom, cat}, %{item => new},
fn x -> Map.put(x, item, new) end)
else
state.cells
end end
{step, seq} = List.pop_at(state.init_seq, 0) {step, seq} = List.pop_at(state.init_seq, 0)
state1 = %State{cells: cells, init_seq: seq} state1 = %State{init_seq: seq}
Core.update({state1, proc, syns, env}) Core.update({state1, proc, syns, env})
if step do if step do
Process.sleep(1) Process.sleep(1)
#step.(state1)
step.() step.()
end end
end end
@ -78,27 +72,15 @@ defmodule Scopes.Core.Environ do
Core.send_message(rcvr, head, data) Core.send_message(rcvr, head, data)
end end
def send_value(addr, value) do
send_message(addr, ~w(csys data)a, %{value: value})
end
def connect(addr = {dom, _cat, _item}, target, op \\ []) do def connect(addr = {dom, _cat, _item}, target, op \\ []) do
send_message(addr, [dom, :connect], send_message(addr, [dom, :connect],
%{target: get_cell(target), op: op}) %{target: get_cell(target), op: op})
end end
# accessing cell registry via state.cells
def get_cell(state, {dom, cat, item}) do
get_in(state.cells, [{dom, cat}, item])
end
def send_message(state, addr, head, data) do
cell = get_cell(state, addr)
Core.send_message(cell, head, data)
end
def connect_state(state, addr, target, op \\ []) do
send_message(state, addr, ~w(csys connect)a,
%{target: get_cell(state, target), op: op})
end
# delegating tasks to env # delegating tasks to env
def delegate(env, func) do def delegate(env, func) do
@ -106,6 +88,6 @@ defmodule Scopes.Core.Environ do
end end
def forward_value(env, addr, value) do def forward_value(env, addr, value) do
delegate(env, &send_message(&1, addr, ~w(csys data)a, %{value: value})) delegate(env, fn -> send_message(addr, ~w(csys data)a, %{value: value}) end)
end end
end end

View file

@ -18,14 +18,14 @@ defmodule Scopes.CoreTest do
describe "core-basic:" do describe "core-basic:" do
test "minimal-b1" do test "minimal-b1" do
Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) Environ.setup(Program.prepare_basic(), Program.init_seq_b1())
Process.sleep(5) Process.sleep(10)
env = Environ.get_cell({:env, :c00}) _env = Environ.get_cell({:env, :c00})
Environ.forward_value(env, {:csys, :c00, "0-0"}, 0) Environ.send_value({:csys, :c00, "0-0"}, 0)
assert 0 = receive_data().value assert 0 = receive_data().value
Environ.forward_value(env, {:csys, :s01, "1-0"}, 1) Environ.send_value({:csys, :s01, "1-0"}, 1)
assert receive_data().value == 1 assert receive_data().value == 1
#assert receive_data().value in [-1, 1] #assert receive_data().value in [-1, 1]
Environ.forward_value(env, {:csys, :s01, "1-1"}, 3) Environ.send_value({:csys, :s01, "1-1"}, 3)
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}" refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}"
@ -33,11 +33,11 @@ defmodule Scopes.CoreTest do
test "recursive-1" do test "recursive-1" do
Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) Environ.setup(Program.prepare_basic(), Program.init_recursive_1())
Process.sleep(5) Process.sleep(10)
env = Environ.get_cell({:env, :c00}) _env = Environ.get_cell({:env, :c00})
Environ.forward_value(env, {:csys, :s01, "1-1"}, 42) Environ.send_value({:csys, :s01, "1-1"}, 42)
assert receive_data().value == 42 assert receive_data().value == 42
Environ.forward_value(env, {:csys, :s01, "1-1"}, 47) Environ.send_value({:csys, :s01, "1-1"}, 47)
assert receive_data().value == 5 assert receive_data().value == 5
refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}" refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}"
end end