-module(gleamy@structures@set). -compile([no_auto_import, nowarn_unused_vars]). -export([contains/2, delete/2, filter/2, fold/3, from_list/2, insert/2, intersection/2, new/1, count/1, to_list/1, union/2, take/2]). -spec contains(gleamy@structures@tree@red_black_tree:tree(GJL), GJL) -> 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(GJN), GJN) -> gleamy@structures@tree@red_black_tree:tree(GJN). delete(Set, Member) -> gleamy@structures@tree@red_black_tree:delete(Set, Member). -spec filter( gleamy@structures@tree@red_black_tree:tree(GJQ), fun((GJQ) -> boolean()) ) -> gleamy@structures@tree@red_black_tree:tree(GJQ). 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(GJT), GJV, fun((GJV, GJT) -> GJV) ) -> GJV. fold(Set, Initial, Reducer) -> gleamy@structures@tree@red_black_tree:fold(Set, Initial, Reducer). -spec from_list(list(GJW), fun((GJW, GJW) -> gleam@order:order())) -> gleamy@structures@tree@red_black_tree:tree(GJW). 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(GJZ), GJZ) -> gleamy@structures@tree@red_black_tree:tree(GJZ). insert(Set, Member) -> gleamy@structures@tree@red_black_tree:insert(Set, Member). -spec intersection( gleamy@structures@tree@red_black_tree:tree(GKC), gleamy@structures@tree@red_black_tree:tree(GKC) ) -> gleamy@structures@tree@red_black_tree:tree(GKC). 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((GKG, GKG) -> gleam@order:order())) -> gleamy@structures@tree@red_black_tree:tree(GKG). 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 to_list(gleamy@structures@tree@red_black_tree:tree(GKO)) -> list(GKO). to_list(Set) -> gleamy@structures@tree@red_black_tree:foldr( Set, [], fun(A, I) -> gleam@io:println(gleam@string:inspect(I)), [I | A] end ). -spec union( gleamy@structures@tree@red_black_tree:tree(GKR), gleamy@structures@tree@red_black_tree:tree(GKR) ) -> gleamy@structures@tree@red_black_tree:tree(GKR). 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 ). -spec take(gleamy@structures@tree@red_black_tree:tree(GKK), list(GKK)) -> gleamy@structures@tree@red_black_tree:tree(GKK). 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.