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)
|
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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue