defmodule AbsintheCacheFairy.Behaviour do
@moduledoc """
Behaviour that the cache needs to conform to.
# TODO: Write more docs
"""
@type hash :: String.t()
@type key :: hash | {atom, hash} | {non_neg_integer(), non_neg_integer()}
@type error :: String.t()
@type stored_value :: any()
@type cache :: atom()
@type size_type :: :megabytes
@doc ~s"""
Get the value for the given key from the cache.
"""
@callback get(cache, hash) :: {:ok, any} | {:error, error} | nil
@doc ~s"""
Put a query document in the cache with the key as cache key.
"""
@callback store(cache, key, stored_value) :: :ok | {:error, error}
@doc ~s"""
Get the value for the given key from the cache. If there is no record with this
key, execute `fun`, store its value under the `key` key if and only if it is not
an error and return in. If there is more than one query for that key, `fun`
should be executed only once and the rest of the queries will wait until the result.
is ready.
"""
@callback get_or_store(cache, key, fun, fun) :: {:ok, stored_value} | {:error, error}
@callback get_or_store(cache, key, fun) :: {:ok, stored_value} | {:error, error}
@callback size(cache, size_type) :: float()
@callback clear_all(cache) :: :ok
@optional_callbacks get_or_store: 3, get_or_store: 4
end