I have two compile-time lists of types. How do I find their set intersection (to determine if one is a subset of the other) and their set difference? See the block comments below:

import std.variant;

alias Zero = void;

struct One{}

struct Difference(T, U) {
    static if (is(U == Zero)) alias type = T;
    else static if(is(T == U)) alias type = Zero;
    else static if (is(T _ == VariantN!V, V...)) {
        static if(is(U __ == VariantN!W, W...)) {
/* if W[1..$] is a subset of V[1..$] alias type = Algebraic!(setDifference(V[1..$], W[1..$])) */
        } else {
/* if U is subset of V[1..$] alias type = Algebraic!(setDifference(V[1..$], U)) */
        }
    } else static if(is(U _ == VariantN!V, V...)) {
/* if V[1..$] is a single element set containing T alias type = Zero */
    }

    unittest
    {
        static assert (is(Zero == Difference!(Zero, Zero).type));
        static assert (is(One == Difference!(One, Zero).type));
        static assert (!is(Difference!(Zero, One).type));
static assert (is(Algebraic!(One) == Difference!(Algebraic!(One, One), Algebraic!(One)).type));
    }
}

void main() {
    alias type = Difference!(One, Zero).type;
}

Reply via email to