elixir-in-action/chapter7/todo_cache/lib/todo/cache.ex

33 lines
706 B
Elixir

defmodule Todo.Cache do
use GenServer
def start() do
GenServer.start(__MODULE__, nil)
end
def server_process(cache_pid, todo_list_name) do
GenServer.call(cache_pid, {:server_process, todo_list_name})
end
@impl true
def init(_) do
{:ok, %{}}
end
@impl true
def handle_call({:server_process, todo_list_name}, _, todo_servers) do
case Map.fetch(todo_servers, todo_list_name) do
{:ok, todo_server} ->
{:reply, todo_server, todo_servers}
:error ->
{:ok, new_todo_server} = Todo.Server.start()
{
:reply,
new_todo_server,
Map.put(todo_servers, todo_list_name, new_todo_server)
}
end
end
end