I think full sumtypes are probably usually overkill and I rarely use it; but I have some lib ideas that need... something
struct shape{
int w,h;
bool isCircle()=>h==-1;
bool isSquare()=>w==h;
bool isRect()=>h!=-1 && w!=h;
}
void drawCircle(shape s){
assert(s.isCircle)
...
Classification could be pulled out from tag and it being a full union in the above example.
Radix sorts classify using a user defined function to then index an array of pointers to make a copy
fizzbuzz using ranges is kinda tricky, despite being computationally trivial, maintaining the control flow from classification while having access to the data is hard
etc.
so api wise...
classify: returns an int from the value
classmax: defines that max value classify may return(enum)
match: calls classify, swizzles the value to a collection of lamdas
etc.
what preexisting code plays with such ideas and how do they name their things?