Repeatedly run a computation until it produces a Just
This can be useful when paired with a monad that has side effects.
For example, we may have genId :: IO (Maybe Id)
that uses a
random number generator to allocate ids, but fails if it finds a
collision. We can repeatedly run this with
retract (untilJust genId) :: IO Id