-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/8]). -export_type([keyspace_compaction/0, compacted_keyspace/0]). -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). -type keyspace_compaction() :: {keyspace_compaction, binary(), trove@internal@btree:btree(bitstring(), bitstring()), fun((bitstring(), bitstring()) -> gleam@order:order())}. -type compacted_keyspace() :: {compacted_keyspace, binary(), trove@internal@btree:btree(bitstring(), bitstring())}. -file("src/trove/internal/compactor.gleam", 123). ?DOC(false). -spec rewrite_keyspace( keyspace_compaction(), trove@internal@store:store(), trove@internal@store:store(), integer() ) -> {ok, compacted_keyspace()} | {error, trove@internal@btree:error()}. rewrite_keyspace(Keyspace, Old_store, New_store, Capacity) -> Bytes_codec = trove@codec:bit_array(), Entries = trove@internal@btree@range:'query'( erlang:element(3, Keyspace), Old_store, none, none, forward, Bytes_codec, Bytes_codec, erlang:element(4, Keyspace) ), gleam@result:'try'( trove@internal@btree:load_from_yielder( Entries, New_store, Capacity, Bytes_codec, Bytes_codec, erlang:element(4, Keyspace) ), fun(New_tree) -> {ok, {compacted_keyspace, erlang:element(2, Keyspace), New_tree}} end ). -file("src/trove/internal/compactor.gleam", 152). ?DOC(false). -spec keyspace_to_header(compacted_keyspace()) -> trove@internal@store:keyspace_header(). keyspace_to_header(Ks) -> {keyspace_header, erlang:element(2, Ks), trove@internal@btree:root(erlang:element(3, Ks)), trove@internal@btree:size(erlang:element(3, Ks)), trove@internal@btree:dirt(erlang:element(3, Ks))}. -file("src/trove/internal/compactor.gleam", 71). ?DOC(false). -spec rewrite_all( trove@internal@btree:btree(JSV, JSW), list(keyspace_compaction()), trove@internal@store:store(), trove@internal@store:store(), integer(), trove@codec:codec(JSV), trove@codec:codec(JSW), fun((JSV, JSV) -> gleam@order:order()) ) -> {ok, {trove@internal@btree:btree(JSV, JSW), list(compacted_keyspace()), trove@internal@store:store()}} | {error, trove@internal@btree:error()}. rewrite_all( Tree, Keyspaces, Old_store, New_store, Capacity, Key_codec, Value_codec, Key_compare ) -> Default_entries = trove@internal@btree@range:'query'( Tree, Old_store, none, none, forward, Key_codec, Value_codec, Key_compare ), gleam@result:'try'( trove@internal@btree:load_from_yielder( Default_entries, New_store, Capacity, Key_codec, Value_codec, Key_compare ), fun(New_tree) -> gleam@result:'try'( gleam@list:try_map( Keyspaces, fun(_capture) -> rewrite_keyspace( _capture, Old_store, New_store, Capacity ) end ), fun(New_keyspaces) -> Header = {header, trove@internal@btree:root(New_tree), trove@internal@btree:size(New_tree), trove@internal@btree:dirt(New_tree), gleam@list:map(New_keyspaces, fun keyspace_to_header/1)}, gleam@result:'try'( begin _pipe = trove@internal@store:put_header( New_store, Header ), gleam@result:map_error( _pipe, fun(Field@0) -> {store_error, Field@0} end ) end, fun(_) -> gleam@result:'try'( begin _pipe@1 = trove@internal@store:sync( New_store ), gleam@result:map_error( _pipe@1, fun(Field@0) -> {store_error, Field@0} end ) end, fun(_) -> {ok, {New_tree, New_keyspaces, New_store}} end ) end ) end ) end ). -file("src/trove/internal/compactor.gleam", 33). ?DOC(false). -spec compact( trove@internal@btree:btree(JSJ, JSK), list(keyspace_compaction()), trove@internal@store:store(), binary(), integer(), trove@codec:codec(JSJ), trove@codec:codec(JSK), fun((JSJ, JSJ) -> gleam@order:order()) ) -> {ok, {trove@internal@btree:btree(JSJ, JSK), list(compacted_keyspace()), trove@internal@store:store()}} | {error, trove@internal@btree:error()}. compact( Tree, Keyspaces, Old_store, New_store_path, Capacity, 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 = rewrite_all( Tree, Keyspaces, Old_store, New_store, Capacity, Key_codec, Value_codec, Key_compare ), case Res of {ok, Val} -> {ok, Val}; {error, E} -> _ = trove@internal@store:close(New_store), {error, E} end end ).