Current section
Files
Jump to
Current section
Files
priv/templates/class_merger/cache.ex.eex
defmodule <%= @module_name %>.ClassMerger.Cache do
@moduledoc """
ETS-backed cache for memoising resolved Tailwind class strings.
Stores `{input_key, resolved_string}` pairs so that identical
lists of class tokens are merged only once per application lifetime.
"""
use GenServer
@table __MODULE__
# --- Public API -----------------------------------------------------------
@doc "Starts the cache and registers it under its module name."
def start_link(_opts) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
@doc "Returns the cached string for `key`, or `nil` if absent."
@spec get(term()) :: String.t() | nil
def get(key), do: lookup(key)
@doc "Stores `value` under `key` and returns `value`."
@spec put(term(), String.t()) :: String.t()
def put(key, value) do
:ets.insert(@table, {key, value})
value
end
# --- GenServer callbacks ---------------------------------------------------
@impl GenServer
def init(_) do
:ets.new(@table, [:named_table, :public, read_concurrency: true])
{:ok, []}
end
# --- Private helpers -------------------------------------------------------
defp lookup(key) do
case :ets.lookup(@table, key) do
[{^key, value}] -> value
[] -> nil
end
end
end