From 38207ab8d97a3928e71caccbd980ed5d74ea7558 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 20 May 2026 12:28:14 +0200 Subject: [PATCH] csys: work in progress: Environ: + initialization sequence for system setup --- lib/csys/csys.ex | 6 ++---- lib/csys/environ.ex | 19 +++++++++++++------ test/csys_test.exs | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 34d2b29..5d87c9a 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -82,11 +82,9 @@ defmodule Scopes.CSys do # helpers def compose(ops) do - fn msg -> - for op <- ops, reduce: msg do + &(for op <- ops, reduce: &1 do nil -> nil val -> op.(val) - end - end + end) end end diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index b8192f1..7a798cc 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -3,8 +3,12 @@ defmodule Scopes.CSys.Environ do alias Scopes.CSys alias Scopes.Shape - def setup({state, proc}) do - scope = {[], &proc_env/2, [], self()} + defmodule State do + defstruct [neurons: [], 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 @@ -12,14 +16,17 @@ defmodule Scopes.CSys.Environ do def proc_env(msg, scope) do case Shape.head(msg) do - [:csys, :created | _rest] -> register_creation(msg, scope) + [:csys, :created | _rest] -> process_creation(msg, scope) _ -> nil end send(CSys.env(scope), msg) end - def register_creation(msg, {state, proc, syns, env}) do - new = Shape.data(msg).new - CSys.update({[new | state], proc, syns, env}) + def process_creation(msg, {state, proc, syns, env}) do + new = Shape.data(msg).new + 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 diff --git a/test/csys_test.exs b/test/csys_test.exs index 2340ffe..2aa026a 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -34,7 +34,7 @@ defmodule Scopes.CSysTest do CSys.send_message(two, [:csys, :create, :pred]) three = receive_data([:csys, :created]).new CSys.send_message(three, [:csys, :connect], %{target: zero}) - Process.sleep(2) + Process.sleep(3) CSys.send_value(three, 3) assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]