From acda4f301fc6516ba0e6a2efdb40dd96fd4daa06 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 19 May 2026 15:38:18 +0200 Subject: [PATCH] csys: provide compose() function for combining synapse operators --- lib/csys/csys.ex | 15 +++++++++++++++ test/csys_test.exs | 10 +++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 92f842e..4c36062 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -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 diff --git a/test/csys_test.exs b/test/csys_test.exs index 8c1eac6..2970e7f 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -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