Current section

Files

Jump to
bravo src bravo@bag.erl
Raw

src/bravo@bag.erl

-module(bravo@bag).
-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]).
-export_type([bag/1]).
-opaque bag(GUL) :: {bag, gleam@erlang@atom:atom_(), integer()} |
{gleam_phantom, GUL}.
-spec new(binary(), integer(), bravo@etc:access()) -> {ok, bag(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, [bag, 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, {bag, A, Keypos}} end
)
end
).
-spec insert(bag(GUR), list(GUR)) -> boolean().
insert(Bag, Objects) ->
gleam@bool:guard(
gleam@list:is_empty(Objects),
false,
fun() ->
bravo:try_insert(
erlang:element(2, Bag),
erlang:element(3, Bag),
Objects
)
end
).
-spec lookup(bag(GUU), any()) -> list(GUU).
lookup(Bag, Key) ->
bravo:try_lookup(erlang:element(2, Bag), Key).
-spec delete(bag(any())) -> boolean().
delete(Bag) ->
bravo:try_delete(erlang:element(2, Bag)).
-spec delete_key(bag(any()), any()) -> nil.
delete_key(Bag, Key) ->
bravo:try_delete_key(erlang:element(2, Bag), Key),
nil.
-spec delete_all_objects(bag(any())) -> nil.
delete_all_objects(Bag) ->
bravo:try_delete_all_objects(erlang:element(2, Bag)),
nil.
-spec delete_object(bag(GVF), GVF) -> nil.
delete_object(Bag, Object) ->
bravo:try_delete_object(erlang:element(2, Bag), Object),
nil.
-spec tab2file(bag(any()), binary(), boolean(), boolean(), boolean()) -> boolean().
tab2file(Bag, Filename, Object_count, Md5sum, Sync) ->
case bravo:try_tab2file(
erlang:element(2, Bag),
gleam@string:to_utf_codepoints(Filename),
Object_count,
Md5sum,
Sync
) of
ok ->
true;
{error, _} ->
false
end.
-spec tab2list(bag(GVP)) -> list(GVP).
tab2list(Bag) ->
bravo:try_tab2list(erlang:element(2, Bag)).
-spec file2tab(
binary(),
boolean(),
fun((gleam@dynamic:dynamic_()) -> {ok, GVJ} | {error, any()})
) -> gleam@option:option(bag(GVJ)).
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/bag"/utf8>>,
function => <<"file2tab"/utf8>>,
line => 152})
end,
Table = {bag, 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.
-spec insert_new(bag(GVS), list(GVS)) -> boolean().
insert_new(Bag, Objects) ->
gleam@bool:guard(
gleam@list:is_empty(Objects),
false,
fun() ->
bravo:try_insert_new(
erlang:element(2, Bag),
erlang:element(3, Bag),
Objects
)
end
).
-spec take(bag(GVV), any()) -> list(GVV).
take(Bag, Key) ->
bravo:try_take(erlang:element(2, Bag), Key).
-spec member(bag(any()), any()) -> boolean().
member(Bag, Key) ->
bravo:try_member(erlang:element(2, Bag), Key).