-module(bravo@uset). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/3, insert/2, lookup/2, delete/1, delete_key/2, delete_all_objects/1, delete_object/2, tab2file/5, tab2list/1, file2tab/3]). -export_type([u_set/1]). -opaque u_set(HEQ) :: {u_set, gleam@erlang@atom:atom_(), integer()} | {gleam_phantom, HEQ}. -spec new(binary(), integer(), bravo@etc:access()) -> {ok, u_set(any())} | {error, gleam@option:option(bravo@error:erlang_error())}. new(Name, Keypos, Access) -> Atom = erlang:binary_to_atom(Name), gleam@bool:guard( Keypos < 1, {error, none}, fun() -> gleam@result:'try'( begin _pipe = bravo:try_new(Atom, [set, case Access of public -> public; protected -> protected; private -> private end, named_table, {keypos, Keypos}, {write_concurrency, auto}, {read_concurrency, true}, {decentralized_counters, true}]), gleam@result:map_error(_pipe, fun(E) -> {some, E} end) end, fun(A) -> {ok, {u_set, A, Keypos}} end ) end ). -spec insert(u_set(HEW), list(HEW)) -> boolean(). insert(Uset, Objects) -> bravo:try_insert(erlang:element(2, Uset), erlang:element(3, Uset), Objects). -spec lookup(u_set(HEZ), any()) -> gleam@option:option(HEZ). lookup(Uset, Key) -> case bravo:try_lookup(erlang:element(2, Uset), Key) of [Res] -> {some, Res}; _ -> none end. -spec delete(u_set(any())) -> boolean(). delete(Uset) -> bravo:try_delete(erlang:element(2, Uset)). -spec delete_key(u_set(any()), any()) -> nil. delete_key(Uset, Key) -> bravo:try_delete_key(erlang:element(2, Uset), Key), nil. -spec delete_all_objects(u_set(any())) -> nil. delete_all_objects(Uset) -> bravo:try_delete_all_objects(erlang:element(2, Uset)), nil. -spec delete_object(u_set(HFK), HFK) -> nil. delete_object(Uset, Object) -> bravo:try_delete_object(erlang:element(2, Uset), Object), nil. -spec tab2file(u_set(any()), binary(), boolean(), boolean(), boolean()) -> boolean(). tab2file(Uset, Filename, Object_count, Md5sum, Sync) -> case bravo:try_tab2file( erlang:element(2, Uset), gleam@string:to_utf_codepoints(Filename), Object_count, Md5sum, Sync ) of ok -> true; {error, _} -> false end. -spec tab2list(u_set(HFU)) -> list(HFU). tab2list(Uset) -> bravo:try_tab2list(erlang:element(2, Uset)). -spec file2tab( binary(), boolean(), fun((gleam@dynamic:dynamic_()) -> {ok, HFO} | {error, any()}) ) -> gleam@option:option(u_set(HFO)). file2tab(Filename, Verify, Decoder) -> case bravo:try_file2tab(gleam@string:to_utf_codepoints(Filename), Verify) of {error, _} -> none; {ok, Name} -> _assert_subject = gleam@dynamic:int( bravo:inform(Name, erlang:binary_to_atom(<<"keypos"/utf8>>)) ), {ok, Keypos} = 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 => <<"bravo/uset"/utf8>>, function => <<"file2tab"/utf8>>, line => 156}) end, Table = {u_set, Name, Keypos}, gleam@bool:guard( not (gleam@list:all( tab2list(Table), fun(Obj) -> case Decoder(gleam@dynamic:from(Obj)) of {ok, _} -> true; {error, _} -> false end end )), none, fun() -> {some, Table} end ) end.