64 lines
1.6 KiB
Elixir
64 lines
1.6 KiB
Elixir
defmodule Scopes.CSys.Program do
|
|
import Scopes.CSys, only: [
|
|
neuron: 1, update_neuron: 1, synapse: 3,
|
|
syns: 1, env: 1
|
|
]
|
|
|
|
alias Scopes.Core.Actor
|
|
|
|
# programs
|
|
|
|
def basic_prog() do
|
|
default = &basic_active/2
|
|
%{default: default,
|
|
initial: default,
|
|
active: default,
|
|
retired: default
|
|
}
|
|
end
|
|
|
|
# processors
|
|
|
|
def basic_active(msg = {head, _info}, scope) do
|
|
case head do
|
|
[:csys, :create, :pred | _rest] -> create_pred(scope)
|
|
[:csys, :create, :succ | _rest] -> create_succ(scope)
|
|
#[:csys, :next | _rest] -> CSys.update_neuron({state, &basic_active/2, syns, env})
|
|
#[:csys, :next | _rest] -> next(:active, scope)
|
|
_ -> forward(msg, scope) || notify(msg, scope)
|
|
end
|
|
end
|
|
|
|
def basic_active(msg, scope) do
|
|
forward(msg, scope) || notify(msg, scope)
|
|
end
|
|
|
|
# processor steps
|
|
|
|
def notify(msg, scope) do
|
|
Actor.send(env(scope), msg)
|
|
end
|
|
|
|
def forward(msg, scope) do
|
|
Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end)
|
|
end
|
|
|
|
# step functions
|
|
|
|
# create_... steps
|
|
# todo: provide parameters for initial state, proc / stage, op,
|
|
# depending on state and stage (proc) of self, as well as message, env, ...
|
|
|
|
def create_pred(scope = {_state, proc, _syns, env}) do
|
|
syn = synapse(self(), &Function.identity/1, 0)
|
|
new = neuron({[], proc, [syn], env})
|
|
notify({:created, new}, scope)
|
|
end
|
|
|
|
def create_succ (scope = {state, proc, syns, env}) do
|
|
new = neuron({[], proc, [], env})
|
|
syn = synapse(new, &Function.identity/1, 0)
|
|
update_neuron({state, proc, [syn | syns], env})
|
|
notify({:created, new}, scope)
|
|
end
|
|
end
|