-module(internal@ets@memo). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([create/1, set/3, get/2, memoize/3]). -file("/home/wsl/gleam/rememo/src/internal/ets/memo.gleam", 8). -spec create(fun((carpenter@table:set(any(), any())) -> IGG)) -> IGG. 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 => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"internal/ets/memo"/utf8>>, function => <<"create"/utf8>>, line => 11}) end, Result = Fun(Cache_table), carpenter@table:drop(Cache_table), Result. -file("/home/wsl/gleam/rememo/src/internal/ets/memo.gleam", 25). -spec set(carpenter@table:set(IGI, IGJ), IGI, IGJ) -> nil. set(Cache, Key, Value) -> carpenter@table:insert(Cache, [{Key, Value}]). -file("/home/wsl/gleam/rememo/src/internal/ets/memo.gleam", 29). -spec get(carpenter@table:set(IGM, IGN), IGM) -> {ok, IGN} | {error, nil}. get(Cache, Key) -> case carpenter@table:lookup(Cache, Key) of [] -> {error, nil}; [{_, V} | _] -> {ok, V} end. -file("/home/wsl/gleam/rememo/src/internal/ets/memo.gleam", 36). -spec memoize(carpenter@table:set(IGS, IGT), IGS, fun(() -> IGT)) -> IGT. memoize(Cache, Key, Fun) -> case get(Cache, Key) of {ok, Value} -> Value; {error, nil} -> Result = Fun(), set(Cache, Key, Result), Result end.