defmodule Cache.Agent do @moduledoc """ This module is the Agent adapter. Very lightweight use only """ use Agent @behaviour Cache @impl Cache def opts_definition, do: [] def start_link(opts \\ []) do with {:error, {:already_started, pid}} <- Agent.start_link(fn -> %{} end, opts) do {:ok, pid} end end @impl Cache def child_spec({cache_name, opts}) do %{ id: "#{cache_name}_anana_cache_agent", start: {Cache.Agent, :start_link, [Keyword.put(opts, :name, cache_name)]} } end @impl Cache def get(cache_name, key, _opts \\ []) do Agent.get(cache_name, fn state -> {:ok, Map.get(state, key)} end) end @impl Cache def put(cache_name, key, _ttl \\ nil, value, _opts \\ []) do Agent.update(cache_name, fn state -> Map.put(state, key, value) end) end @impl Cache def delete(cache_name, key, _opts \\ []) do Agent.update(cache_name, fn state -> Map.delete(state, key) end) end end