lib/skogsra/cache.ex

defmodule Skogsra.Cache do
  @moduledoc """
  This module defines the helpers for the variable cache. The cache works with
  persistent terms.
  """
  alias Skogsra.Env

  ############
  # Public API

  @doc """
  Gets a variable value `env` from the cache.
  """
  @spec get_env(Env.t()) :: {:ok, term()} | :error
  def get_env(env)

  def get_env(%Env{} = env) do
    key = gen_key(env)

    case :persistent_term.get(key, nil) do
      nil -> :error
      value -> {:ok, value}
    end
  end

  @doc """
  Stores a variable `env` in a persistent term.
  """
  @spec put_env(Env.t(), term()) :: :ok
  def put_env(env, value)

  def put_env(%Env{} = env, value) do
    key = gen_key(env)
    :persistent_term.put(key, value)
  end

  #########
  # Helpers

  @doc false
  @spec gen_key(Env.t()) :: integer()
  def gen_key(env)

  def gen_key(%Env{} = env) do
    :erlang.phash2(env)
  end
end