Also note that one does not need to define both promote_rule(::Type{A}, ::Type{B}) and promote_rule(::Type{B}, ::Type{A}) – the symmetry is implied by the way promote_rule is used in the promotion process.
You don’t want to use promote_rule here. Instead use promote_type.
The key is like Stefan said, types definepromote_rule for one of the argument orders, and then you callpromote_type (or simply promote) to get the type (or values) that result from the promotion. When Julia tries to figure out what a given promotion should be (via promote_type or promote) it tries promote_ruleboth ways for you and unions the result.