defmodule TimeTravel.Jumper do use GenServer alias __MODULE__ def start_link(_) do GenServer.start_link(__MODULE__, %{}, name: __MODULE__) end @impl true def init(_) do {:ok, %{}} end def state do GenServer.call(TimeTravel.Jumper, :show_state) end def set(keys_and_assigns) when is_list(keys_and_assigns) do GenServer.cast(Jumper, {:set, keys_and_assigns}) end def get(socket_id, time_key) do GenServer.call(Jumper, {:get, socket_id, time_key}) end def clear do GenServer.cast(TimeTravel.Jumper, :clear) end @impl true def handle_call({:get, socket_id, key}, _from, state) do {:reply, get_in(state, [socket_id, key]), state} end def handle_call(:show_state, _from, state) do {:reply, state, state} end @impl true def handle_cast({:set, keys_and_assigns}, state) when is_list(keys_and_assigns) do assigns = List.last(keys_and_assigns) keys = keys_and_assigns |> Enum.drop(-1) |> Enum.map(&Access.key(&1, %{})) {:noreply, put_in(state, keys, assigns)} end def handle_cast(:clear, _state) do {:noreply, %{}} end end