(defn wider-tag*
"Given two Classes returns the wider one"
[from to]
(if (not= from to)
(if (primitive? from)
(if (primitive? to)
(wider-primitive from to)
(or (and (numeric? from)
(numeric? to)
to)
((convertible-primitives from) to)))
(if (primitive? to)
(or (and (numeric? from)
(numeric? to)
from)
((convertible-primitives to) from))
(if (convertible? from to)
to
(when (convertible? to from)
from))))
from))