cache() :: any()
input() :: any()
key() :: any()
key_fun() :: (input() -> key())
value() :: any()
cached?(cache(), input()) :: true | false
new(key_fun()) :: cache()
put(cache(), input(), value()) :: cache()
value(cache(), input()) :: value()