@johnny > drop the transaction if we've had no luck for x seconds
That would be [registerDelay](https://hackage.haskell.org/package/base-4.19.0.0/docs/GHC-Conc.html#v:registerDelay). It's in IO, but it gives you a TVar, that will flip to True when the time comes. You can readTVar it to decide retry or bail.
Also, you can wrap pretty much anything in `timeout` (in IO proper).