diff --git a/lib/core/environ.ex b/lib/core/environ.ex index 4269918..d910d2d 100644 --- a/lib/core/environ.ex +++ b/lib/core/environ.ex @@ -19,10 +19,11 @@ defmodule Scopes.Core.Environ do end 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 = 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"}}) scope = {state, proc, [], env} Core.create(msg, scope) @@ -43,7 +44,8 @@ defmodule Scopes.Core.Environ do new = data.new addr = data[:addr] if addr do - Actor.register(new, cells(), addr) + #Actor.register(new, cells(), addr) + register(new, addr) end {step, seq} = List.pop_at(state.init_seq, 0) state1 = %State{init_seq: seq} @@ -55,15 +57,30 @@ defmodule Scopes.Core.Environ do end # 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 - data = Registry.lookup(cells(), addr) - if data do - [{cell, _val}] = data - cell - else + cells = get_cells(addr) + if cells == [] do Logger.warning "No cell found at address #{inspect(addr)}!" nil + else + [{cell, _val}] = cells + cell end end