-module(bravo@oset). -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([o_set/1]). -opaque o_set(HBA) :: {o_set, gleam@erlang@atom:atom_(), integer()} | {gleam_phantom, HBA}. -spec new(binary(), integer(), bravo@etc:access()) -> {ok, o_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, [ordered_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, {o_set, A, Keypos}} end ) end ). -spec insert(o_set(HBG), list(HBG)) -> boolean(). insert(Oset, Objects) -> bravo:try_insert(erlang:element(2, Oset), erlang:element(3, Oset), Objects). -spec lookup(o_set(HBJ), any()) -> gleam@option:option(HBJ). lookup(Oset, Key) -> case bravo:try_lookup(erlang:element(2, Oset), Key) of [Res] -> {some, Res}; _ -> none end. -spec delete(o_set(any())) -> boolean(). delete(Oset) -> bravo:try_delete(erlang:element(2, Oset)). -spec delete_key(o_set(any()), any()) -> nil. delete_key(Oset, Key) -> bravo:try_delete_key(erlang:element(2, Oset), Key), nil. -spec delete_all_objects(o_set(any())) -> nil. delete_all_objects(Oset) -> bravo:try_delete_all_objects(erlang:element(2, Oset)), nil. -spec delete_object(o_set(HBU), HBU) -> nil. delete_object(Oset, Object) -> bravo:try_delete_object(erlang:element(2, Oset), Object), nil. -spec tab2file(o_set(any()), binary(), boolean(), boolean(), boolean()) -> boolean(). tab2file(Oset, Filename, Object_count, Md5sum, Sync) -> case bravo:try_tab2file( erlang:element(2, Oset), gleam@string:to_utf_codepoints(Filename), Object_count, Md5sum, Sync ) of ok -> true; {error, _} -> false end. -spec tab2list(o_set(HCE)) -> list(HCE). tab2list(Oset) -> bravo:try_tab2list(erlang:element(2, Oset)). -spec file2tab( binary(), boolean(), fun((gleam@dynamic:dynamic_()) -> {ok, HBY} | {error, any()}) ) -> gleam@option:option(o_set(HBY)). 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/oset"/utf8>>, function => <<"file2tab"/utf8>>, line => 156}) end, Table = {o_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.