Given 2 sets (unions), return its Cartesian product in a set of tuples, e.g.

CartesianProduct<1 | 2, 'a' | 'b'> 
// [1, 'a'] | [2, 'a'] | [1, 'b'] | [2, 'b']