defmodule QuickBEAM.Storage do @moduledoc false @table :quickbeam_local_storage @spec init() :: :ok def init do if :ets.whereis(@table) == :undefined do :ets.new(@table, [:named_table, :public, :set, read_concurrency: true]) end end @spec get_item([String.t()]) :: term() | nil def get_item([key]) do case :ets.lookup(@table, key) do [{^key, value}] -> value [] -> nil end end @spec set_item(list()) :: nil def set_item([key, value]) do :ets.insert(@table, {key, value}) nil end @spec remove_item([String.t()]) :: nil def remove_item([key]) do :ets.delete(@table, key) nil end @spec clear(term()) :: nil def clear(_args) do :ets.delete_all_objects(@table) nil end @spec key([integer()]) :: String.t() | nil def key([index]) when is_integer(index) do keys = :ets.select(@table, [{{:"$1", :_}, [], [:"$1"]}]) Enum.at(Enum.sort(keys), index) end def key(_), do: nil @spec length(term()) :: non_neg_integer() def length(_args) do :ets.info(@table, :size) end end