-module(gleamy_structures@set). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([contains/2, delete/2, filter/2, fold/3, from_list/2, insert/2, intersection/2, new/1, count/1, take/2, to_list/1, union/2]). -spec contains(gleamy_structures@tree@red_black_tree:tree(HFI), HFI) -> boolean(). contains(Set, Member) -> case gleamy_structures@tree@red_black_tree:find(Set, Member) of {ok, _} -> true; {error, _} -> false end. -spec delete(gleamy_structures@tree@red_black_tree:tree(HFK), HFK) -> gleamy_structures@tree@red_black_tree:tree(HFK). delete(Set, Member) -> gleamy_structures@tree@red_black_tree:delete(Set, Member). -spec filter( gleamy_structures@tree@red_black_tree:tree(HFN), fun((HFN) -> boolean()) ) -> gleamy_structures@tree@red_black_tree:tree(HFN). filter(Set, Property) -> gleamy_structures@tree@red_black_tree:fold( Set, Set, fun(Set@1, I) -> case Property(I) of true -> Set@1; false -> gleamy_structures@tree@red_black_tree:delete(Set@1, I) end end ). -spec fold( gleamy_structures@tree@red_black_tree:tree(HFQ), HFS, fun((HFS, HFQ) -> HFS) ) -> HFS. fold(Set, Initial, Reducer) -> gleamy_structures@tree@red_black_tree:fold(Set, Initial, Reducer). -spec from_list(list(HFT), fun((HFT, HFT) -> gleam@order:order())) -> gleamy_structures@tree@red_black_tree:tree(HFT). from_list(Members, Compare) -> gleam@list:fold( Members, gleamy_structures@tree@red_black_tree:new(Compare), fun gleamy_structures@tree@red_black_tree:insert/2 ). -spec insert(gleamy_structures@tree@red_black_tree:tree(HFW), HFW) -> gleamy_structures@tree@red_black_tree:tree(HFW). insert(Set, Member) -> gleamy_structures@tree@red_black_tree:insert(Set, Member). -spec intersection( gleamy_structures@tree@red_black_tree:tree(HFZ), gleamy_structures@tree@red_black_tree:tree(HFZ) ) -> gleamy_structures@tree@red_black_tree:tree(HFZ). intersection(First, Second) -> gleamy_structures@tree@red_black_tree:fold( Second, gleamy_structures@tree@red_black_tree:clear(First), fun(A, I) -> case gleamy_structures@tree@red_black_tree:find(First, I) of {ok, _} -> gleamy_structures@tree@red_black_tree:insert(A, I); {error, _} -> A end end ). -spec new(fun((HGD, HGD) -> gleam@order:order())) -> gleamy_structures@tree@red_black_tree:tree(HGD). new(Compare) -> gleamy_structures@tree@red_black_tree:new(Compare). -spec count(gleamy_structures@tree@red_black_tree:tree(any())) -> integer(). count(Set) -> gleamy_structures@tree@red_black_tree:fold(Set, 0, fun(A, _) -> A + 1 end). -spec take(gleamy_structures@tree@red_black_tree:tree(HGH), list(HGH)) -> gleamy_structures@tree@red_black_tree:tree(HGH). take(Set, Desired) -> case Desired of [X | Xs] -> case gleamy_structures@tree@red_black_tree:find(Set, X) of {ok, X@1} -> gleamy_structures@tree@red_black_tree:insert( take(Set, Xs), X@1 ); {error, _} -> take(Set, Xs) end; [] -> gleamy_structures@tree@red_black_tree:clear(Set) end. -spec to_list(gleamy_structures@tree@red_black_tree:tree(HGL)) -> list(HGL). to_list(Set) -> gleamy_structures@tree@red_black_tree:foldr( Set, [], fun(A, I) -> [I | A] end ). -spec union( gleamy_structures@tree@red_black_tree:tree(HGO), gleamy_structures@tree@red_black_tree:tree(HGO) ) -> gleamy_structures@tree@red_black_tree:tree(HGO). union(First, Second) -> gleamy_structures@tree@red_black_tree:fold( First, Second, fun(A, I) -> gleamy_structures@tree@red_black_tree:insert(A, I) end ).