Current section

Files

Jump to
rememo src rememo@ets@memo.erl
Raw

src/rememo@ets@memo.erl

-module(rememo@ets@memo).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create/1, set/3, get/2, memoize/3]).
-spec create(fun((carpenter@table:set(any(), any())) -> HTY)) -> HTY.
create(Fun) ->
Table_name = youid@uuid:v4_string(),
_assert_subject = begin
_pipe = carpenter@table:build(Table_name),
_pipe@1 = carpenter@table:privacy(_pipe, private),
_pipe@2 = carpenter@table:write_concurrency(
_pipe@1,
auto_write_concurrency
),
_pipe@3 = carpenter@table:read_concurrency(_pipe@2, true),
_pipe@4 = carpenter@table:decentralized_counters(_pipe@3, true),
_pipe@5 = carpenter@table:compression(_pipe@4, false),
carpenter@table:set(_pipe@5)
end,
{ok, Cache_table} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"rememo/ets/memo"/utf8>>,
function => <<"create"/utf8>>,
line => 18})
end,
Result = Fun(Cache_table),
carpenter@table:drop(Cache_table),
Result.
-spec set(carpenter@table:set(HUA, HUB), HUA, HUB) -> nil.
set(Cache, Key, Value) ->
carpenter@table:insert(Cache, [{Key, Value}]).
-spec get(carpenter@table:set(HUE, HUF), HUE) -> {ok, HUF} | {error, nil}.
get(Cache, Key) ->
case carpenter@table:lookup(Cache, Key) of
[] ->
{error, nil};
[{_, V} | _] ->
{ok, V}
end.
-spec memoize(carpenter@table:set(HUK, HUL), HUK, fun(() -> HUL)) -> HUL.
memoize(Cache, Key, Fun) ->
case get(Cache, Key) of
{ok, Value} ->
Value;
{error, nil} ->
Result = Fun(),
set(Cache, Key, Result),
Result
end.