Let’s say I have a package that defines an abstract type with an interface: if you define successor_is_prime, then my module will define predecessor_is_prime.
module Arithmetic
function successor_is_prime end
predecessor_is_prime(x::MyAbstractNumber) = successor_is_prime(x-2)
end
Now, I realize that I would rather have a new function is_prime, and define all the other functions in terms of it so the new interface is: if you define is_prime then my module will define predecessor_is_prime and successor_is_prime:
module Arithmetic
function is_prime end
predecessor_is_prime(x::MyAbstractNumber) = is_prime(x-1)
sucessor_is_prime(x::MyAbstractNumber) = is_prime(x+1)
end
Is there a way to do this without breaking changes and without creating a dispatch loop that causes a StackOverflow error when none of the methods are defined for a concrete subtype?
(The real-world problem that motivates this is adding modify! and defining all other AbstractDict operations in terms of it, making the AbstractDict interface: implement modify! (and optionally iterate) and get everything else for free. Related to https://github.com/JuliaLang/julia/pull/33758)