Just for completeness I am posting the macro I am talking about here:
macro custom_order(lt_func)
ordering_type = lt_func.args[1].args[2].args[1]
unwrap_node_lt_func = quote
Base.Order.lt(
o::$ordering_type,
a::MergedIterators.MergedIteratorStateNode,
b::MergedIterators.MergedIteratorStateNode
) = Base.Order.lt(o, a.value, b.value)
end
quote
$(esc(lt_func))
$(esc(unwrap_node_lt_func))
end
end
Here lt_func is the user defined baz. unwrap_node_lt_func is an auto-defined method to remove ambiguity. It ends up being defined by the user through the use of the library provided macro. MergedIterator.MergedIteratorStateNode is Foo. And finally ordering_type is Bar1.
Example use would be:
struct AbsOrder <: Base.Order.Ordering end
@custom_order Base.Order.lt(::AbsOrder, a, b) = Base.Order.lt(Base.Order.Forward, abs(a), abs(b))