Sometimes, it's good to have a function form of a conditional. Julia's Base
ifelse for this, but... psyche, it's not defined in Base but in Core!
While this rarely matters, if you're trying to define a new dispatch for
you will find an interesting error message:
julia> Base.ifelse(x::Array,y,z) = 2x ERROR: cannot add methods to a builtin function Stacktrace:  top-level scope at none:1
Thus no new methods can be added to this function in its current form, blocking symbolic libraries like ModelingToolkit.jl or vectorization libraries like LoopVectorization.jl from extending the operations of this function onto their own types.
To get around this issue, we need a separate version of ifelse that is extendable.
This is difficult to do in the standard case without any inference issues, though
it is being worked on in this PR.
In the meantime, to allow for development of
ifelse dispatches from a common
platform, IfElse.jl has been created to hold this common definition.
Thus IfElse.jl does one thing: it defines
IfElse.ifelse to call
on its fallbacks, but be free to extend. This way, all of the libraries that
want to extend an
ifelse function can do so on a common form. If and when
#37343 is fixed, this function will be deprecated for an extendable
but for now it will allow for the thriving package ecosystem to continue its
development in this area.