module Test.General where

import Control.Concurrent       (threadDelay)
import Control.Monad            (when, (>>=))
import Control.Monad.Base       (MonadBase, liftBase)
import Control.Monad.IO.Class   (MonadIO, liftIO)
import Control.Monad.Trans.Cont (ContT, evalContT)
import Data.Bool                (not)
import Data.Function            ((.))
import System.Exit              (exitFailure)
import System.IO                (IO)

import Hedgehog (Group, Property, PropertyT, checkParallel, property, withTests)

main' :: Group -> IO ()
main' group = checkParallel group >>= \ok -> when (not ok) exitFailure

example :: PropertyT IO () -> Property
example = withTests 1 . property

contExample :: ContT () (PropertyT IO) () -> Property
contExample = example . evalContT

contIO :: MonadIO m => ContT a IO a -> ContT () m a
contIO = liftIO . evalContT

pause :: MonadBase IO m => m ()
pause = liftBase (threadDelay 1000000)