lib/pistis/cluster/state_storage.ex

defmodule Pistis.Cluster.StateStorage do
  use GenServer
  alias Pistis.Cluster.State

  @me __MODULE__

  def start_link(_args), do: GenServer.start_link(@me, %{}, name: @me)

  def init(state), do: {:ok, state}

  def read(), do: GenServer.call(@me, {:read})

  def store({all_members, failures, leader}) do
    members = Enum.filter(all_members, fn m -> m not in failures end)
    new_state = %State{members: members, failures: failures, leader: leader}
    store_state(new_state)
  end

  def store(leader: leader) do
    Map.put(read(), :leader, leader) |> store_state()
  end

  def store(members: members) do
    Map.put(read(), :members, members) |> store_state()
  end

  def store(failures: failures) do
    Map.put(read(), :failures, failures) |> store_state()
  end

  defp store_state(new_state), do: GenServer.call(@me, {:store, new_state})

  def handle_call({:read}, _, state), do: {:reply, state, state}

  def handle_call({:store, new_state}, _, _), do: {:reply, new_state, new_state}

end