elixir-todo-list/other/simple_registry.ex

37 lines
758 B
Elixir

defmodule SimpleRegistry do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
def register(name) when is_atom(name) do
Process.link(Process.whereis(__MODULE__))
if :ets.insert_new(__MODULE__, {name, self()}) do
:ok
else
:error
end
end
def whereis(name) when is_atom(name) do
case :ets.lookup(__MODULE__, name) do
[{^name, value}] -> value
[] -> nil
end
end
@impl GenServer
def init(_) do
Process.flag(:trap_exit, true)
:ets.new(__MODULE__, [:named_table, :public])
{:ok, nil}
end
@impl GenServer
def handle_info({:EXIT, pid, _reason}, state) do
:ets.match_delete(__MODULE__, {:_, pid})
{:noreply, state}
end
end