csys: work in progress: Environ: + initialization sequence for system setup
This commit is contained in:
parent
998be76e34
commit
38207ab8d9
3 changed files with 16 additions and 11 deletions
|
|
@ -82,11 +82,9 @@ defmodule Scopes.CSys do
|
||||||
# helpers
|
# helpers
|
||||||
|
|
||||||
def compose(ops) do
|
def compose(ops) do
|
||||||
fn msg ->
|
&(for op <- ops, reduce: &1 do
|
||||||
for op <- ops, reduce: msg do
|
|
||||||
nil -> nil
|
nil -> nil
|
||||||
val -> op.(val)
|
val -> op.(val)
|
||||||
end
|
end)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,12 @@ defmodule Scopes.CSys.Environ do
|
||||||
alias Scopes.CSys
|
alias Scopes.CSys
|
||||||
alias Scopes.Shape
|
alias Scopes.Shape
|
||||||
|
|
||||||
def setup({state, proc}) do
|
defmodule State do
|
||||||
scope = {[], &proc_env/2, [], self()}
|
defstruct [neurons: [], init_seq: []]
|
||||||
|
end
|
||||||
|
|
||||||
|
def setup({state, proc}, seq \\ []) do
|
||||||
|
scope = {%State{init_seq: seq}, &proc_env/2, [], self()}
|
||||||
env = CSys.neuron(scope)
|
env = CSys.neuron(scope)
|
||||||
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
|
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
|
||||||
env
|
env
|
||||||
|
|
@ -12,14 +16,17 @@ defmodule Scopes.CSys.Environ do
|
||||||
|
|
||||||
def proc_env(msg, scope) do
|
def proc_env(msg, scope) do
|
||||||
case Shape.head(msg) do
|
case Shape.head(msg) do
|
||||||
[:csys, :created | _rest] -> register_creation(msg, scope)
|
[:csys, :created | _rest] -> process_creation(msg, scope)
|
||||||
_ -> nil
|
_ -> nil
|
||||||
end
|
end
|
||||||
send(CSys.env(scope), msg)
|
send(CSys.env(scope), msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
def register_creation(msg, {state, proc, syns, env}) do
|
def process_creation(msg, {state, proc, syns, env}) do
|
||||||
new = Shape.data(msg).new
|
new = Shape.data(msg).new
|
||||||
CSys.update({[new | state], proc, syns, env})
|
neurons = [new | state.neurons]
|
||||||
|
{step, seq} = List.pop_at(state.init_seq, 0)
|
||||||
|
if step, do: step.(neurons)
|
||||||
|
CSys.update({%{state | neurons: neurons, init_seq: seq}, proc, syns, env})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ defmodule Scopes.CSysTest do
|
||||||
CSys.send_message(two, [:csys, :create, :pred])
|
CSys.send_message(two, [:csys, :create, :pred])
|
||||||
three = receive_data([:csys, :created]).new
|
three = receive_data([:csys, :created]).new
|
||||||
CSys.send_message(three, [:csys, :connect], %{target: zero})
|
CSys.send_message(three, [:csys, :connect], %{target: zero})
|
||||||
Process.sleep(2)
|
Process.sleep(3)
|
||||||
CSys.send_value(three, 3)
|
CSys.send_value(three, 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]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue