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