module Main where import System.CircuitBreaker (CircuitBreaker, withBreaker, initialBreakerState, CircuitBreakerConf, CircutBreakerError(..)) import Control.Monad(forM_) import Control.Monad.Trans (liftIO) import Control.Monad.Reader (ReaderT, runReaderT) import Control.Concurrent(threadDelay) import Control.Monad (when, forever) import UnliftIO.Exception (catchAny) import System.Random (randomIO) testBreaker :: CircuitBreaker "Test" 1000 4 testBreaker = undefined main :: IO () main = do cbConf <- initialBreakerState -- TODO the api for calling withBreaker kinda sucks. It'd be great to drop the 'undefined' forM_ [1..30] $ const . noteError . flip runReaderT cbConf $ withBreaker testBreaker computation threadDelay 5000000 noteError . flip runReaderT cbConf $ withBreaker testBreaker computation where noteError action = print =<< catchAny action (const $ pure (Left Failed)) -- | This computation fails 50% of the time computation :: ReaderT CircuitBreakerConf IO Int computation = do shouldFail <- liftIO randomIO when shouldFail $ error "Failed" pure 42