-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, insert_new/2, take/2, member/2, first/1, last/1, next/2, prev/2]). -export_type([u_set/1]). -opaque u_set(HLQ) :: {u_set, gleam@erlang@atom:atom_(), integer()} | {gleam_phantom, HLQ}. -spec new(binary(), integer(), bravo:access()) -> {ok, u_set(any())} | {error, bravo:bravo_error()}. new(Name, Keypos, Access) -> Atom = erlang:binary_to_atom(Name), gleam@bool:guard( Keypos < 1, {error, non_positive_keypos}, fun() -> gleam@result:'try'(bravo_ffi: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}]), fun(A) -> {ok, {u_set, A, Keypos}} end) end ). -spec insert(u_set(HLV), list(HLV)) -> boolean(). insert(Uset, Objects) -> gleam@bool:guard( gleam@list:is_empty(Objects), false, fun() -> bravo_ffi:try_insert( erlang:element(2, Uset), erlang:element(3, Uset), Objects ) end ). -spec lookup(u_set(HLY), any()) -> gleam@option:option(HLY). lookup(Uset, Key) -> case bravo_ffi:try_lookup(erlang:element(2, Uset), Key) of [Res] -> {some, Res}; _ -> none end. -spec delete(u_set(any())) -> boolean(). delete(Uset) -> bravo_ffi:try_delete(erlang:element(2, Uset)). -spec delete_key(u_set(any()), any()) -> nil. delete_key(Uset, Key) -> bravo_ffi:try_delete_key(erlang:element(2, Uset), Key), nil. -spec delete_all_objects(u_set(any())) -> nil. delete_all_objects(Uset) -> bravo_ffi:try_delete_all_objects(erlang:element(2, Uset)), nil. -spec delete_object(u_set(HMJ), HMJ) -> nil. delete_object(Uset, Object) -> bravo_ffi:try_delete_object(erlang:element(2, Uset), Object), nil. -spec tab2file(u_set(any()), binary(), boolean(), boolean(), boolean()) -> {ok, nil} | {error, bravo:bravo_error()}. tab2file(Uset, Filename, Object_count, Md5sum, Sync) -> bravo_ffi:try_tab2file( erlang:element(2, Uset), gleam@string:to_utf_codepoints(Filename), Object_count, Md5sum, Sync ). -spec tab2list(u_set(HMW)) -> list(HMW). tab2list(Uset) -> bravo_ffi:try_tab2list(erlang:element(2, Uset)). -spec file2tab( binary(), boolean(), fun((gleam@dynamic:dynamic_()) -> {ok, HMP} | {error, any()}) ) -> {ok, u_set(HMP)} | {error, bravo:bravo_error()}. file2tab(Filename, Verify, Decoder) -> gleam@result:'try'( bravo_ffi:try_file2tab(gleam@string:to_utf_codepoints(Filename), Verify), fun(Name) -> _assert_subject = gleam@dynamic:int( bravo_ffi: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@list:map( tab2list(Table), fun(Obj) -> delete_object(Table, Obj), case erlang:tuple_size(Obj) of 1 -> insert(Table, [erlang:element(1, Obj)]); _ -> insert(Table, [Obj]) end end ), gleam@bool:guard( (gleam@list:all(tab2list(Table), fun(Obj@1) -> _pipe = Obj@1, _pipe@1 = gleam@dynamic:from(_pipe), _pipe@2 = Decoder(_pipe@1), gleam@result:is_ok(_pipe@2) end)), {ok, Table}, fun() -> delete(Table), {error, decode_failure} end ) end ). -spec insert_new(u_set(HMZ), list(HMZ)) -> boolean(). insert_new(Uset, Objects) -> gleam@bool:guard( gleam@list:is_empty(Objects), false, fun() -> bravo_ffi:try_insert_new( erlang:element(2, Uset), erlang:element(3, Uset), Objects ) end ). -spec take(u_set(HNC), any()) -> gleam@option:option(HNC). take(Uset, Key) -> case bravo_ffi:try_take(erlang:element(2, Uset), Key) of [Res] -> {some, Res}; _ -> none end. -spec member(u_set(any()), any()) -> boolean(). member(Uset, Key) -> bravo_ffi:try_member(erlang:element(2, Uset), Key). -spec first(u_set(any())) -> gleam@option:option(any()). first(Uset) -> bravo_ffi:try_first(erlang:element(2, Uset)). -spec last(u_set(any())) -> gleam@option:option(any()). last(Uset) -> bravo_ffi:try_last(erlang:element(2, Uset)). -spec next(u_set(any()), HNT) -> gleam@option:option(HNT). next(Uset, Key) -> bravo_ffi:try_next(erlang:element(2, Uset), Key). -spec prev(u_set(any()), HNX) -> gleam@option:option(HNX). prev(Uset, Key) -> bravo_ffi:try_prev(erlang:element(2, Uset), Key).