Packages

Data structures in pure Gleam! Including tree, heap, non empty list, map, set, and priority queue.

Current section

Files

Jump to
gleamy_structures src gleamy@structures@map.erl
Raw

src/gleamy@structures@map.erl

-module(gleamy@structures@map).
-compile([no_auto_import, nowarn_unused_vars]).
-export([new/1, insert/3, find/2, has_key/2, delete/2, count/1, fold/3, filter/2, merge/2, from_list/2, to_list/1, take/2]).
-spec new(fun((FSC, FSC) -> gleam@order:order())) -> gleamy@structures@tree@red_black_tree_kv:tree(FSC, any()).
new(Compare) ->
gleamy@structures@tree@red_black_tree_kv:new(Compare).
-spec insert(gleamy@structures@tree@red_black_tree_kv:tree(FSG, FSH), FSG, FSH) -> gleamy@structures@tree@red_black_tree_kv:tree(FSG, FSH).
insert(Map, Key, Value) ->
gleamy@structures@tree@red_black_tree_kv:insert(Map, Key, Value).
-spec find(gleamy@structures@tree@red_black_tree_kv:tree(FSM, FSN), FSM) -> {ok,
{FSM, FSN}} |
{error, nil}.
find(Map, Key) ->
gleamy@structures@tree@red_black_tree_kv:find(Map, Key).
-spec has_key(gleamy@structures@tree@red_black_tree_kv:tree(FSS, any()), FSS) -> boolean().
has_key(Map, Key) ->
case gleamy@structures@tree@red_black_tree_kv:find(Map, Key) of
{ok, _} ->
true;
{error, _} ->
false
end.
-spec delete(gleamy@structures@tree@red_black_tree_kv:tree(FSW, FSX), FSW) -> gleamy@structures@tree@red_black_tree_kv:tree(FSW, FSX).
delete(Map, Key) ->
gleamy@structures@tree@red_black_tree_kv:delete(Map, Key).
-spec count(gleamy@structures@tree@red_black_tree_kv:tree(any(), any())) -> integer().
count(Map) ->
gleamy@structures@tree@red_black_tree_kv:fold(
Map,
0,
fun(A, _, _) -> A + 1 end
).
-spec fold(
gleamy@structures@tree@red_black_tree_kv:tree(FTG, FTH),
FTK,
fun((FTK, FTG, FTH) -> FTK)
) -> FTK.
fold(Map, Initial, Reducer) ->
gleamy@structures@tree@red_black_tree_kv:fold(Map, Initial, Reducer).
-spec filter(
gleamy@structures@tree@red_black_tree_kv:tree(FTL, FTM),
fun((FTL, FTM) -> boolean())
) -> gleamy@structures@tree@red_black_tree_kv:tree(FTL, FTM).
filter(Map, Property) ->
gleamy@structures@tree@red_black_tree_kv:fold(
Map,
Map,
fun(Map@1, K, V) -> case Property(K, V) of
true ->
Map@1;
false ->
gleamy@structures@tree@red_black_tree_kv:delete(Map@1, K)
end end
).
-spec merge(
gleamy@structures@tree@red_black_tree_kv:tree(FTR, FTS),
gleamy@structures@tree@red_black_tree_kv:tree(FTR, FTS)
) -> gleamy@structures@tree@red_black_tree_kv:tree(FTR, FTS).
merge(First, Second) ->
gleamy@structures@tree@red_black_tree_kv:fold(
First,
Second,
fun(A, K, V) ->
gleamy@structures@tree@red_black_tree_kv:insert(A, K, V)
end
).
-spec from_list(list({FUG, FUH}), fun((FUG, FUG) -> gleam@order:order())) -> gleamy@structures@tree@red_black_tree_kv:tree(FUG, FUH).
from_list(Members, Compare) ->
gleam@list:fold(
Members,
gleamy@structures@tree@red_black_tree_kv:new(Compare),
fun(Tree, I) ->
gleamy@structures@tree@red_black_tree_kv:insert(
Tree,
erlang:element(1, I),
erlang:element(2, I)
)
end
).
-spec to_list(gleamy@structures@tree@red_black_tree_kv:tree(FUL, FUM)) -> list({FUL,
FUM}).
to_list(Map) ->
gleamy@structures@tree@red_black_tree_kv:foldr(
Map,
[],
fun(A, K, V) -> [{K, V} | A] end
).
-spec take(gleamy@structures@tree@red_black_tree_kv:tree(FTZ, FUA), list(FTZ)) -> gleamy@structures@tree@red_black_tree_kv:tree(FTZ, FUA).
take(Map, Desired) ->
case Desired of
[X | Xs] ->
case gleamy@structures@tree@red_black_tree_kv:find(Map, X) of
{ok, X@1} ->
gleamy@structures@tree@red_black_tree_kv:insert(
take(Map, Xs),
erlang:element(1, X@1),
erlang:element(2, X@1)
);
{error, _} ->
take(Map, Xs)
end;
[] ->
gleamy@structures@tree@red_black_tree_kv:clear(Map)
end.