-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.