get rid of Environ.State.cells: just use cell registry
This commit is contained in:
parent
8919d99cbc
commit
4ec4b62a59
2 changed files with 20 additions and 38 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue