csys: provide compose() function for combining synapse operators

This commit is contained in:
Helmut Merz 2026-05-19 15:38:18 +02:00
parent 02db5f3ad4
commit acda4f301f
2 changed files with 20 additions and 5 deletions

View file

@ -78,4 +78,19 @@ defmodule Scopes.CSys do
def proc(scope), do: elem(scope, 1)
def syns(scope), do: elem(scope, 2)
def env(scope), do: elem(scope, 3)
# helpers
def compose(ops) do
fn msg ->
Enum.reduce(ops, msg,
fn op, val ->
case val do
nil -> nil
val -> op.(val)
end
end
)
end
end
end

View file

@ -29,17 +29,17 @@ defmodule Scopes.CSysTest do
#CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()})
CSys.send_message(zero, [:csys, :create, :pred], %{op: Program.negate()})
one = receive_data([:csys, :created]).new
CSys.send_message(one, [:csys, :create, :succ], %{op: CSys.data_only()})
CSys.send_message(one, [:csys, :create, :succ],
%{op: CSys.compose([CSys.data_only(), Program.negate()])})
two = receive_data([:csys, :created]).new
Process.sleep(1)
CSys.send_value(one, 1)
#assert 1 = receive_data().value
assert Enum.member?([-1, 1], receive_data().value)
assert Enum.member?([-1, 1], receive_data().value)
assert receive_data().value in [-1, 1]
assert receive_data().value in [-1, 1]
CSys.send_message(two, [:csys, :create, :pred])
three = receive_data([:csys, :created]).new
CSys.send_message(three, [:csys, :connect], %{target: zero})
Process.sleep(1)
Process.sleep(2)
CSys.send_value(three, 3)
assert 3 = receive_data().value
assert 3 = receive_data().value