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