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, insert_obj/2, lookup/2, delete/1]).
-export_type([bag/0]).
-opaque bag() :: {bag, gleam@erlang@atom:atom_(), integer()}.
-spec new(binary(), integer(), bravo@etc:access()) -> {ok, bag()} |
{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(), list(any())) -> boolean().
insert(Bag, Objects) ->
bravo:try_insert(erlang:element(2, Bag), erlang:element(3, Bag), Objects).
-spec insert_obj(bag(), list(bravo@object:object(any()))) -> boolean().
insert_obj(Bag, Objects) ->
_pipe = gleam@list:map(Objects, fun bravo@object:extract/1),
insert(Bag, _pipe).
-spec lookup(bag(), any()) -> list(bravo@object:object(gleam@dynamic:dynamic_())).
lookup(Bag, Key) ->
_pipe = bravo:try_lookup(erlang:element(2, Bag), Key),
gleam@list:map(_pipe, fun(Raw) -> bravo@object:new(Raw) end).
-spec delete(bag()) -> boolean().
delete(Bag) ->
bravo:try_delete(erlang:element(2, Bag)).