Current section
Files
Jump to
Current section
Files
lib/lru_cache.ex
# This binding was generated automatically to ensure consistency across languages
# Generated using ChatGPT (GPT-5) from the canonical Ruby SDK
# API is stable and production-ready
defmodule CRUDJT_LRUCache do
alias :persistent_term, as: PersistentTerm
alias :ets, as: Ets
@capacity_key {:crudjt_lru_cache, :capacity}
@cache_table :crudjt_lru_cache
@ttl_table :crudjt_lru_cache_ttl
@spec init_(capacity :: integer) :: any
def init_(capacity) do
PersistentTerm.put(@capacity_key, capacity)
if Enum.member?(Ets.all(), @cache_table) == false do
Ets.new(@cache_table, [:set, :public, :named_table])
Ets.new(@ttl_table, [:ordered_set, :public, :named_table])
else
Ets.delete_all_objects(@cache_table)
Ets.delete_all_objects(@ttl_table)
end
:ok
end
@spec get(key :: integer) :: integer
def get(key) do
with {key, value} <- extract(key) do
insert(key, value)
value
end
end
@spec put(key :: integer, value :: integer) :: any
def put(key, value) do
extract(key)
insert(key, value)
evict()
end
@spec del(key :: integer) :: :ok | :error
def del(key) do
case Ets.lookup(@cache_table, key) do
[{_, uniq, _value}] ->
# Видаляємо записи з обох таблиць
Ets.delete(@cache_table, key)
Ets.delete(@ttl_table, uniq)
:ok
[] ->
:error
end
end
defp insert(key, value, uniq \\ uniq()) do
Ets.insert(@cache_table, {key, uniq, value})
Ets.insert(@ttl_table, {uniq, key})
end
defp evict() do
if Ets.info(@cache_table, :size) > PersistentTerm.get(@capacity_key) do
uniq = Ets.first(@ttl_table)
[{_, key}] = Ets.lookup(@ttl_table, uniq)
Ets.delete(@ttl_table, uniq)
Ets.delete(@cache_table, key)
end
end
defp extract(key) do
case Ets.lookup(@cache_table, key) do
[{_,uniq, value}] ->
Ets.delete(@ttl_table, uniq)
{key, value}
[] ->
-1
end
end
defp uniq do
:erlang.unique_integer([:monotonic])
end
end