module Cachix.Client.Retry
  ( retryAll,
  )
where

import Control.Exception.Safe (MonadMask)
import Control.Retry (RetryPolicy, RetryStatus, exponentialBackoff, limitRetries, recoverAll)
import Protolude

-- Catches all exceptions except skipAsyncExceptions
retryAll :: (MonadIO m, MonadMask m) => (RetryStatus -> m a) -> m a
retryAll :: (RetryStatus -> m a) -> m a
retryAll = RetryPolicyM m -> (RetryStatus -> m a) -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
RetryPolicyM m -> (RetryStatus -> m a) -> m a
recoverAll RetryPolicyM m
RetryPolicy
defaultRetryPolicy
  where
    defaultRetryPolicy :: RetryPolicy
    defaultRetryPolicy :: RetryPolicyM m
defaultRetryPolicy =
      Int -> RetryPolicy
exponentialBackoff (1000 Int -> Int -> Int
forall a. Num a => a -> a -> a
* 1000) RetryPolicyM m -> RetryPolicyM m -> RetryPolicyM m
forall a. Semigroup a => a -> a -> a
<> Int -> RetryPolicy
limitRetries 5