Current section
Files
Jump to
Current section
Files
src/trove@internal@compactor.erl
-module(trove@internal@compactor).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/trove/internal/compactor.gleam").
-export([compact/7]).
-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/trove/internal/compactor.gleam", 15).
?DOC(false).
-spec compact(
trove@internal@btree:btree(JOU, JOV),
trove@internal@store:store(),
binary(),
integer(),
trove@codec:codec(JOU),
trove@codec:codec(JOV),
fun((JOU, JOU) -> gleam@order:order())
) -> {ok, {trove@internal@btree:btree(JOU, JOV), trove@internal@store:store()}} |
{error, trove@internal@btree:btree_error()}.
compact(
Tree,
Old_store,
New_store_path,
Capacity,
Key_codec,
Value_codec,
Key_compare
) ->
Entries_yielder = trove@internal@btree@range:'query'(
Tree,
Old_store,
none,
none,
forward,
Key_codec,
Value_codec,
Key_compare
),
gleam@result:'try'(
begin
_pipe = trove@internal@store:open(New_store_path),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(New_store) ->
Res = begin
gleam@result:'try'(
trove@internal@btree:load_from_yielder(
Entries_yielder,
New_store,
Capacity,
Key_codec,
Value_codec,
Key_compare
),
fun(New_tree) ->
Header = {header,
trove@internal@btree:root(New_tree),
trove@internal@btree:size(New_tree),
trove@internal@btree:dirt(New_tree)},
gleam@result:'try'(
begin
_pipe@1 = trove@internal@store:put_header(
New_store,
Header
),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(_) ->
gleam@result:'try'(
begin
_pipe@2 = trove@internal@store:sync(
New_store
),
gleam@result:map_error(
_pipe@2,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(_) -> {ok, {New_tree, New_store}} end
)
end
)
end
)
end,
case Res of
{ok, Val} ->
{ok, Val};
{error, E} ->
_ = trove@internal@store:close(New_store),
{error, E}
end
end
).