OTP
DynamicSupervisor
defmodule GameSupervisor do
use DynamicSupervisor
def start_link(state) do
DynamicSupervisor.start_link(__MODULE__, state, name: __MODULE__)
end
def init(_state) do
DynamicSupervisor.init(strategy: :one_for_one)
end
def register(name) do
DynamicSupervisor.start_child(__MODULE__, {Ring, name})
end
end
GameSupervisor.start_link([])
defmodule Ring do
use GenServer
alias __MODULE__
def child_spec(name) do
%{
id: "#{GameServer}_#{name}",
start: {GenServer, :start_link, [Ring, name, [name: {:via, :swarm, name}]]},
shutdown: 10_000,
restart: :transient
}
end
def start_link(name) do
Swarm.register_name(
"name",
DynamicSupervisor,
:start_child,
[GameSupervisor, {Ring, name}]
)
end
def init(name) do
{:ok, {name, name}}
end
def handle_call(:get, _from, s) do
{:reply, s, s}
end
def handle_cast({:set_l, v}, {_, r}) do
{:noreply, {v, r}}
end
def handle_cast({:set_r, v}, {l, _}) do
{:noreply, {l, v}}
end
end
Ring.start_link("bebong")
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast({:set, "otto"})
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast(:go)
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast(:go)
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast(:go)
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast({:set, :bebong})
IO.inspect(machine |> GenStateMachine.call(:get))
machine |> GenStateMachine.cast(:go)
IO.inspect(machine |> GenStateMachine.call(:get))
Swarm.register_name(
:huhuhu,
DynamicSupervisor,
:start_child,
[GameSupervisor, {Ring, "bwahaha"}]
)
GenServer.call({:via, :swarm, :huhuhu}, :get)
Swarm.register_name(
"yoten",
DynamicSupervisor,
:start_child,
[GameSupervisor, {Ring, "yoten"}]
)
GenServer.cast({:via, :swarm, "yoten"}, :go)
GenServer.call({:via, :swarm, "yoten"}, :get)