this is an obvious case of battling the type system that just gets in the way. The "before" version obviously sucks, but the "after" with magic sprinkled in - sucks even more! is there an alternative solution?
So 9 * 47 - 47 = 376 lines the author got rid of ? Which would imply that if he adds a tenth datatype, he doesn't have to update 47 match blocks sprinkled over the whole code base ?