Current section
Files
Jump to
Current section
Files
src/gleamy@map.erl
-module(gleamy@map).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/1, insert/3, get/2, has_key/2, delete/2, count/1, fold/3, filter/2, merge/2, take/2, from_list/2, to_list/1]).
-spec new(fun((GJZ, GJZ) -> gleam@order:order())) -> gleamy@red_black_tree_map:map_(GJZ, any()).
new(Compare) ->
gleamy@red_black_tree_map:new(Compare).
-spec insert(gleamy@red_black_tree_map:map_(GKD, GKE), GKD, GKE) -> gleamy@red_black_tree_map:map_(GKD, GKE).
insert(Map, Key, Value) ->
gleamy@red_black_tree_map:insert(Map, Key, Value).
-spec get(gleamy@red_black_tree_map:map_(GKJ, GKK), GKJ) -> {ok, GKK} |
{error, nil}.
get(Map, Key) ->
gleamy@red_black_tree_map:find(Map, Key).
-spec has_key(gleamy@red_black_tree_map:map_(GKP, any()), GKP) -> boolean().
has_key(Map, Key) ->
case gleamy@red_black_tree_map:find(Map, Key) of
{ok, _} ->
true;
{error, _} ->
false
end.
-spec delete(gleamy@red_black_tree_map:map_(GKT, GKU), GKT) -> gleamy@red_black_tree_map:map_(GKT, GKU).
delete(Map, Key) ->
gleamy@red_black_tree_map:delete(Map, Key).
-spec count(gleamy@red_black_tree_map:map_(any(), any())) -> integer().
count(Map) ->
gleamy@red_black_tree_map:fold(Map, 0, fun(A, _, _) -> A + 1 end).
-spec fold(
gleamy@red_black_tree_map:map_(GLD, GLE),
GLH,
fun((GLH, GLD, GLE) -> GLH)
) -> GLH.
fold(Map, Initial, Reducer) ->
gleamy@red_black_tree_map:fold(Map, Initial, Reducer).
-spec filter(
gleamy@red_black_tree_map:map_(GLI, GLJ),
fun((GLI, GLJ) -> boolean())
) -> gleamy@red_black_tree_map:map_(GLI, GLJ).
filter(Map, Property) ->
gleamy@red_black_tree_map:fold(
Map,
Map,
fun(Map@1, K, V) -> case Property(K, V) of
true ->
Map@1;
false ->
gleamy@red_black_tree_map:delete(Map@1, K)
end end
).
-spec merge(
gleamy@red_black_tree_map:map_(GLO, GLP),
gleamy@red_black_tree_map:map_(GLO, GLP)
) -> gleamy@red_black_tree_map:map_(GLO, GLP).
merge(Dict, New_entries) ->
gleamy@red_black_tree_map:fold(
New_entries,
Dict,
fun(A, K, V) -> gleamy@red_black_tree_map:insert(A, K, V) end
).
-spec take(gleamy@red_black_tree_map:map_(GLW, GLX), list(GLW)) -> gleamy@red_black_tree_map:map_(GLW, GLX).
take(Map, Desired) ->
case Desired of
[X | Xs] ->
case gleamy@red_black_tree_map:find(Map, X) of
{ok, V} ->
gleamy@red_black_tree_map:insert(take(Map, Xs), X, V);
{error, _} ->
take(Map, Xs)
end;
[] ->
gleamy@red_black_tree_map:clear(Map)
end.
-spec from_list(list({GMD, GME}), fun((GMD, GMD) -> gleam@order:order())) -> gleamy@red_black_tree_map:map_(GMD, GME).
from_list(Members, Compare) ->
gleam@list:fold(
Members,
gleamy@red_black_tree_map:new(Compare),
fun(Tree, I) ->
gleamy@red_black_tree_map:insert(
Tree,
erlang:element(1, I),
erlang:element(2, I)
)
end
).
-spec to_list(gleamy@red_black_tree_map:map_(GMI, GMJ)) -> list({GMI, GMJ}).
to_list(Map) ->
gleamy@red_black_tree_map:foldr(Map, [], fun(A, K, V) -> [{K, V} | A] end).