@johnny > drop the transaction if we’ve had no luck for x seconds
That would be 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).