diff --git a/lib/core/actor.ex b/lib/core/actor.ex index 0355f9f..9a13f6e 100644 --- a/lib/core/actor.ex +++ b/lib/core/actor.ex @@ -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 diff --git a/test/core/actor_test.exs b/test/core/actor_test.exs index f13570c..a004846 100644 --- a/test/core/actor_test.exs +++ b/test/core/actor_test.exs @@ -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)