I want to constrain a type parameter to be a variable sized union whose elements are concrete types of another parametric type. For example:
struct Foo{T}
...
end
struct Bar{T <: Union{Vararg{Foo}}}
a::T
end
This doesn’t work because Vararg isn’t a type. Also the reason I don’t just use a::Foo without a type parameter is because I want T to be a small Union of concrete types itself. This is so that the compiler can use union splitting to optimize rather than have a field with an arbitrary abstract type.
Unions don’t have a size per se (not one dispatchable in your code anyway, without manually distinguishing cases), so the safest way to do this is to explicitly state the types you want to Union in the Union.
Subsets of that Union should still be subtypes of the larger one regardless, though I have not checked explicitly.
Do you have a specific application of this in mind?