defmodule Todo.Cache do use GenServer @impl GenServer def init(_init_args) do Todo.Database.start() {:ok, %{}} end @impl GenServer def handle_call({:server_process, name}, _from, state) do case Map.fetch(state, name) do {:ok, process} -> {:reply, process, state} :error -> {:ok, new_process} = Todo.Server.start(name) new_state = Map.put(state, name, new_process) {:reply, new_process, new_state} end end def start() do GenServer.start(__MODULE__, nil) end def server_process(pid, name) do GenServer.call(pid, {:server_process, name}) end end