-module(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(structures@red_black_tree:tree(GOY), GOY) -> boolean(). contains(Set, Member) -> case structures@red_black_tree:find(Set, Member) of {ok, _} -> true; {error, _} -> false end. -spec delete(structures@red_black_tree:tree(GPA), GPA) -> structures@red_black_tree:tree(GPA). delete(Set, Member) -> structures@red_black_tree:delete(Set, Member). -spec filter(structures@red_black_tree:tree(GPD), fun((GPD) -> boolean())) -> structures@red_black_tree:tree(GPD). filter(Set, Property) -> structures@red_black_tree:fold( Set, Set, fun(Set@1, I) -> case Property(I) of true -> Set@1; false -> structures@red_black_tree:delete(Set@1, I) end end ). -spec fold(structures@red_black_tree:tree(GPG), GPI, fun((GPI, GPG) -> GPI)) -> GPI. fold(Set, Initial, Reducer) -> structures@red_black_tree:fold(Set, Initial, Reducer). -spec from_list(list(GPJ), fun((GPJ, GPJ) -> gleam@order:order())) -> structures@red_black_tree:tree(GPJ). from_list(Members, Compare) -> gleam@list:fold( Members, structures@red_black_tree:new(Compare), fun structures@red_black_tree:insert/2 ). -spec insert(structures@red_black_tree:tree(GPM), GPM) -> structures@red_black_tree:tree(GPM). insert(Set, Member) -> structures@red_black_tree:insert(Set, Member). -spec intersection( structures@red_black_tree:tree(GPP), structures@red_black_tree:tree(GPP) ) -> structures@red_black_tree:tree(GPP). intersection(First, Second) -> structures@red_black_tree:fold( Second, structures@red_black_tree:clear(First), fun(A, I) -> case structures@red_black_tree:find(First, I) of {ok, _} -> structures@red_black_tree:insert(A, I); {error, _} -> A end end ). -spec new(fun((GPT, GPT) -> gleam@order:order())) -> structures@red_black_tree:tree(GPT). new(Compare) -> structures@red_black_tree:new(Compare). -spec count(structures@red_black_tree:tree(any())) -> integer(). count(Set) -> structures@red_black_tree:fold(Set, 0, fun(A, _) -> A + 1 end). -spec to_list(structures@red_black_tree:tree(GQB)) -> list(GQB). to_list(Set) -> structures@red_black_tree:foldr( Set, [], fun(A, I) -> gleam@io:println(gleam@string:inspect(I)), [I | A] end ). -spec union( structures@red_black_tree:tree(GQE), structures@red_black_tree:tree(GQE) ) -> structures@red_black_tree:tree(GQE). union(First, Second) -> structures@red_black_tree:fold( First, Second, fun(A, I) -> structures@red_black_tree:insert(A, I) end ). -spec take(structures@red_black_tree:tree(GPX), list(GPX)) -> structures@red_black_tree:tree(GPX). take(Set, Desired) -> case Desired of [X | Xs] -> case structures@red_black_tree:find(Set, X) of {ok, X@1} -> structures@red_black_tree:insert(take(Set, Xs), X@1); {error, _} -> take(Set, Xs) end; [] -> structures@red_black_tree:clear(Set) end.