Packages

Simple memoization for Gleam

Retired package: Renamed - Use rememo_erlang or rememo_javascript

Current section

Files

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

src/internal@ets@memo.erl

-module(internal@ets@memo).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/internal/ets/memo.gleam").
-export([create/1, set/3, get/2, memoize/3]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-file("src/internal/ets/memo.gleam", 13).
?DOC(false).
-spec create(fun((internal@carpenter@table:set(any(), any())) -> KDS)) -> KDS.
create(Fun) ->
Table_name = begin
_pipe = tempo@instant:now(),
gleam@string:inspect(_pipe)
end,
Cache_table@1 = case begin
_pipe@1 = internal@carpenter@table:build(Table_name),
_pipe@2 = internal@carpenter@table:privacy(_pipe@1, private),
_pipe@3 = internal@carpenter@table:write_concurrency(
_pipe@2,
auto_write_concurrency
),
_pipe@4 = internal@carpenter@table:read_concurrency(_pipe@3, true),
_pipe@5 = internal@carpenter@table:decentralized_counters(_pipe@4, true),
_pipe@6 = internal@carpenter@table:compression(_pipe@5, false),
internal@carpenter@table:set(_pipe@6)
end of
{ok, Cache_table} -> Cache_table;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"internal/ets/memo"/utf8>>,
function => <<"create"/utf8>>,
line => 16,
value => _assert_fail,
start => 335,
'end' => 603,
pattern_start => 346,
pattern_end => 361})
end,
Result = Fun(Cache_table@1),
internal@carpenter@table:drop(Cache_table@1),
Result.
-file("src/internal/ets/memo.gleam", 31).
?DOC(false).
-spec set(internal@carpenter@table:set(KDU, KDV), KDU, KDV) -> nil.
set(Cache, Key, Value) ->
internal@carpenter@table:insert(Cache, [{Key, Value}]).
-file("src/internal/ets/memo.gleam", 36).
?DOC(false).
-spec get(internal@carpenter@table:set(KDY, KDZ), KDY) -> {ok, KDZ} |
{error, nil}.
get(Cache, Key) ->
case internal@carpenter@table:lookup(Cache, Key) of
[] ->
{error, nil};
[{_, V} | _] ->
{ok, V}
end.
-file("src/internal/ets/memo.gleam", 44).
?DOC(false).
-spec memoize(internal@carpenter@table:set(KEE, KEF), KEE, fun(() -> KEF)) -> KEF.
memoize(Cache, Key, Fun) ->
case get(Cache, Key) of
{ok, Value} ->
Value;
{error, nil} ->
Result = Fun(),
set(Cache, Key, Result),
Result
end.