core.actor: add (optional) registration for named actors or neurons
This commit is contained in:
parent
b24c82fe57
commit
ea03dccf53
2 changed files with 21 additions and 3 deletions
|
|
@ -10,6 +10,9 @@ defmodule Scopes.Core.Actor do
|
|||
bhv.(msg)
|
||||
loop(bhv)
|
||||
{:become, bhv_n} -> loop(bhv_n)
|
||||
{:register, reg, name, value} ->
|
||||
Registry.register(reg, name, value)
|
||||
loop(bhv)
|
||||
{:quit} -> nil
|
||||
end
|
||||
end
|
||||
|
|
@ -19,6 +22,12 @@ defmodule Scopes.Core.Actor do
|
|||
spawn_link(fn -> loop(bhv) 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
|
||||
if msg do
|
||||
Process.sleep(delay)
|
||||
|
|
@ -30,6 +39,10 @@ defmodule Scopes.Core.Actor do
|
|||
Kernel.send(ac, {:become, bhv})
|
||||
end
|
||||
|
||||
def register(ac, reg, name, value \\ []) do
|
||||
Kernel.send(ac, {:register, reg, name, value})
|
||||
end
|
||||
|
||||
def stop(ac) do
|
||||
Kernel.send(ac, {:quit})
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,12 +6,17 @@ defmodule Scopes.CoreActorTest do
|
|||
test "basic-life-cycle" do
|
||||
Registry.start_link(keys: :unique, name: Actors)
|
||||
this = self()
|
||||
|
||||
ac = Actor.create(fn msg -> send(this, msg) end)
|
||||
# Actor.register(Actors, :demo, [])
|
||||
# [{pid, _value}] = Registry.lookup(Actors, :demo)
|
||||
# assert pid == ac
|
||||
Actor.register(ac, Actors, :demo, [])
|
||||
# or: ac = Actor.create(fn msg -> send(this, msg) end, Actors, :demo)
|
||||
|
||||
Actor.send(ac, "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.send(ac, "Hello Actor!")
|
||||
Actor.stop(ac)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue