module EZCouch.Retry where
import Prelude ()
import ClassyPrelude
import Control.Concurrent
import EZCouch.Logging
retrying exceptionIntervals action = retrying_ 0
where
retrying_ attempt = catch action processException
where
exceptionInterval = listToMaybe . drop attempt . exceptionIntervals
processException e
| Just i <- exceptionInterval e = do
logLn 2
$ "Error occurred: " ++ show e ++ ". "
++ "Retrying with a " ++ show (i `div` sec) ++ "s delay."
unless (i == 0) (liftIO (threadDelay i))
retrying_ (attempt + 1)
| otherwise = throwIO e
defaultIntervals = [sec, sec * 5, sec * 15]
sec = 10 ^ 6