core.actor: add (optional) registration for named actors or neurons

This commit is contained in:
Helmut Merz 2026-06-16 18:42:30 +02:00
parent b24c82fe57
commit ea03dccf53
2 changed files with 21 additions and 3 deletions

View file

@ -10,6 +10,9 @@ defmodule Scopes.Core.Actor do
bhv.(msg) bhv.(msg)
loop(bhv) loop(bhv)
{:become, bhv_n} -> loop(bhv_n) {:become, bhv_n} -> loop(bhv_n)
{:register, reg, name, value} ->
Registry.register(reg, name, value)
loop(bhv)
{:quit} -> nil {:quit} -> nil
end end
end end
@ -19,6 +22,12 @@ defmodule Scopes.Core.Actor do
spawn_link(fn -> loop(bhv) end) spawn_link(fn -> loop(bhv) end)
end end
def create(bhv, reg, name, value \\ []) do
spawn_link(fn ->
Registry.register(reg, name, value)
loop(bhv) end)
end
def send(ac, msg, delay \\ 0) do def send(ac, msg, delay \\ 0) do
if msg do if msg do
Process.sleep(delay) Process.sleep(delay)
@ -30,6 +39,10 @@ defmodule Scopes.Core.Actor do
Kernel.send(ac, {:become, bhv}) Kernel.send(ac, {:become, bhv})
end end
def register(ac, reg, name, value \\ []) do
Kernel.send(ac, {:register, reg, name, value})
end
def stop(ac) do def stop(ac) do
Kernel.send(ac, {:quit}) Kernel.send(ac, {:quit})
end end

View file

@ -6,12 +6,17 @@ defmodule Scopes.CoreActorTest do
test "basic-life-cycle" do test "basic-life-cycle" do
Registry.start_link(keys: :unique, name: Actors) Registry.start_link(keys: :unique, name: Actors)
this = self() this = self()
ac = Actor.create(fn msg -> send(this, msg) end) ac = Actor.create(fn msg -> send(this, msg) end)
# Actor.register(Actors, :demo, []) Actor.register(ac, Actors, :demo, [])
# [{pid, _value}] = Registry.lookup(Actors, :demo) # or: ac = Actor.create(fn msg -> send(this, msg) end, Actors, :demo)
# assert pid == ac
Actor.send(ac, "Hello Actor!") Actor.send(ac, "Hello Actor!")
assert_receive "Hello Actor!" assert_receive "Hello Actor!"
[{pid, _value}] = Registry.lookup(Actors, :demo)
assert pid == ac
Actor.become(ac, fn _msg -> send(this, "Goodbye") end) Actor.become(ac, fn _msg -> send(this, "Goodbye") end)
Actor.send(ac, "Hello Actor!") Actor.send(ac, "Hello Actor!")
Actor.stop(ac) Actor.stop(ac)