-module(gleamy@set). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/1, insert/2, contains/2, delete/2, filter/2, fold/3, intersection/2, union/2, difference/2, count/1, from_list/2, to_list/1]). -spec new(fun((HKE, HKE) -> gleam@order:order())) -> gleamy@red_black_tree_set:set(HKE). new(Compare) -> gleamy@red_black_tree_set:new(Compare). -spec insert(gleamy@red_black_tree_set:set(HKG), HKG) -> gleamy@red_black_tree_set:set(HKG). insert(Set, Member) -> gleamy@red_black_tree_set:insert(Set, Member). -spec contains(gleamy@red_black_tree_set:set(HKJ), HKJ) -> boolean(). contains(Set, Member) -> case gleamy@red_black_tree_set:find(Set, Member) of {ok, _} -> true; {error, _} -> false end. -spec delete(gleamy@red_black_tree_set:set(HKL), HKL) -> gleamy@red_black_tree_set:set(HKL). delete(Set, Member) -> gleamy@red_black_tree_set:delete(Set, Member). -spec filter(gleamy@red_black_tree_set:set(HKO), fun((HKO) -> boolean())) -> gleamy@red_black_tree_set:set(HKO). filter(Set, Property) -> gleamy@red_black_tree_set:fold( Set, Set, fun(Set@1, I) -> case Property(I) of true -> Set@1; false -> gleamy@red_black_tree_set:delete(Set@1, I) end end ). -spec fold(gleamy@red_black_tree_set:set(HKR), HKT, fun((HKT, HKR) -> HKT)) -> HKT. fold(Set, Initial, Reducer) -> gleamy@red_black_tree_set:fold(Set, Initial, Reducer). -spec intersection( gleamy@red_black_tree_set:set(HKU), gleamy@red_black_tree_set:set(HKU) ) -> gleamy@red_black_tree_set:set(HKU). intersection(First, Second) -> gleamy@red_black_tree_set:fold( Second, gleamy@red_black_tree_set:clear(First), fun(A, I) -> case gleamy@red_black_tree_set:find(First, I) of {ok, _} -> gleamy@red_black_tree_set:insert(A, I); {error, _} -> A end end ). -spec union( gleamy@red_black_tree_set:set(HKY), gleamy@red_black_tree_set:set(HKY) ) -> gleamy@red_black_tree_set:set(HKY). union(First, Second) -> gleamy@red_black_tree_set:fold( First, Second, fun(A, I) -> gleamy@red_black_tree_set:insert(A, I) end ). -spec difference( gleamy@red_black_tree_set:set(HLC), gleamy@red_black_tree_set:set(HLC) ) -> gleamy@red_black_tree_set:set(HLC). difference(Set, Removal) -> gleamy@red_black_tree_set:fold( Removal, Set, fun(Set@1, I) -> gleamy@red_black_tree_set:delete(Set@1, I) end ). -spec count(gleamy@red_black_tree_set:set(any())) -> integer(). count(Set) -> gleamy@red_black_tree_set:fold(Set, 0, fun(A, _) -> A + 1 end). -spec from_list(list(HLI), fun((HLI, HLI) -> gleam@order:order())) -> gleamy@red_black_tree_set:set(HLI). from_list(Members, Compare) -> gleam@list:fold( Members, gleamy@red_black_tree_set:new(Compare), fun gleamy@red_black_tree_set:insert/2 ). -spec to_list(gleamy@red_black_tree_set:set(HLL)) -> list(HLL). to_list(Set) -> gleamy@red_black_tree_set:foldr(Set, [], fun(A, I) -> [I | A] end).