ex-scopes/lib/core/actor.ex

51 lines
1 KiB
Elixir

defmodule Scopes.Core.Actor do
require Logger
defp loop(bhv) do
receive do
{:become, bhv_n} -> loop(bhv_n)
msg ->
Logger.debug([msg: inspect(msg)])
case msg do
{:message, msg} ->
bhv.(msg)
loop(bhv)
{:register, reg, name, value} ->
Registry.register(reg, name, value)
loop(bhv)
{:quit} -> nil
end
end
end
def create(bhv) do
#spawn_link(fn -> loop(bhv) end)
spawn(fn -> loop(bhv) end)
end
def create(bhv, reg, name, value \\ []) do
#spawn_link(fn ->
spawn(fn ->
Registry.register(reg, name, value)
loop(bhv) end)
end
def send(ac, msg, delay \\ 0) do
if msg do
Process.sleep(delay)
Kernel.send(ac, {:message, msg})
end
end
def become(ac, bhv) 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
end