Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

OTP

nb/otp.livemd

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)