Current section

Files

Jump to
raft_fleet lib raft_fleet leader_pid_cache.ex
Raw

lib/raft_fleet/leader_pid_cache.ex

use Croma
defmodule RaftFleet.LeaderPidCache do
@table_name :raft_fleet_leader_pid_cache
defun init() :: :ok do
_table_id = :ets.new(@table_name, [:public, :named_table, {:read_concurrency, true}])
:ok
end
defun get(name :: atom) :: nil | pid do
case :ets.lookup(@table_name, name) do
[] -> nil
[{_, pid}] -> pid
end
end
defun set(name :: atom, leader :: nil | pid) :: :ok do
:ets.insert(@table_name, {name, leader})
:ok
end
defun unset(name :: atom) :: :ok do
:ets.delete(@table_name, name)
:ok
end
defun keys() :: [atom] do
case :ets.first(@table_name) do
:"$end_of_table" -> []
k -> keys_impl(k, [k])
end
end
defp keys_impl(k, acc) do
case :ets.next(@table_name, k) do
:"$end_of_table" -> acc
k -> keys_impl(k, [k | acc])
end
end
end