ex-scopes/lib/csys/environ.ex

34 lines
956 B
Elixir

defmodule Scopes.CSys.Environ do
alias Scopes.CSys
alias Scopes.Shape
defmodule State do
defstruct [neurons: [], names: %{}, init_seq: []]
end
def setup({state, proc}, seq \\ []) do
scope = {%State{init_seq: seq}, &proc_env/2, [], self()}
env = CSys.neuron(scope)
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
env
end
def proc_env(msg, scope) do
case Shape.head(msg) do
[:csys, :created | _rest] -> process_creation(msg, scope)
_ -> nil
end
send(CSys.env(scope), msg)
end
def process_creation(msg, {state, proc, syns, env}) do
data = Shape.data(msg)
new = data.new
neurons = [new | state.neurons]
names = data[:name] && Map.put(state.names, data.name, new) || state.names
{step, seq} = List.pop_at(state.init_seq, 0)
CSys.update({%State{neurons: neurons, names: names, init_seq: seq}, proc, syns, env})
if step, do: step.(neurons)
end
end