module beard.type_set;

public import beard.type_list;
public import beard.fold_left : foldLeft;
public import beard.contains  : contains;

/// A typeset (contains no duplicate types).
template TSet(T...) {
    mixin TL!T;

    template append(U) {
        static if (contains!U)
            alias TSet!T append;
        else
            alias TSet!(T, U) append;
    }

    private template add(alias U, V) { alias U.append!V add; }

    template append(U...) if (U.length > 1) {
        alias foldLeft!(add, TSet!T, U) append;
    }
}
// vim:ts=4 sw=4