defmodule Memoize do @moduledoc """ Simple `FastGlobal` based memoization module to cache function results. """ @doc """ Resolves the given key using the given resolver function. If the key is not found in the cache, the resolver function is called and the result is stored in the cache. If the key is found in the cache, the cached value is returned. ## Examples defmodule MyModule do def my_function(arg1, arg2) do Memoize.resolve({__MODULE__, :my_function, [arg1, arg2]}, fn -> # Do some expensive computation here end) end end """ @spec resolve(key :: any, resolver :: function) :: any def resolve(key, resolver) when is_function(resolver, 0) do case get(key) do nil -> value = resolver.() put(key, value) value value -> value end end defdelegate get(key), to: FastGlobal, as: :get defdelegate put(key, value), to: FastGlobal, as: :put end