packages feed

monad-throw-exit-0.1.0.0: src/System/Exit/MonadThrow.hs

-- | Functions to exit the program anywhere in MonadThrow monads.
module System.Exit.MonadThrow
  ( exitWith
  , exitFailure
  , exitSuccess
  -- * Re-export from the original @System.Exit@ module.
  , ExitCode (ExitSuccess, ExitFailure)
  ) where


import           Control.Monad.Catch (MonadThrow, throwM)
import           GHC.IO.Exception    (IOErrorType (InvalidArgument),
                                      IOException (IOError))
import           System.Exit         (ExitCode (ExitFailure, ExitSuccess))


-- | A version of 'System.Exit.exitWith' available in any 'MonadThrow' context.
--   See 'System.Exit.exitWith' for details
exitWith :: MonadThrow m => ExitCode -> m a
exitWith ExitSuccess = throwM ExitSuccess
exitWith code@(ExitFailure n)
  | n /= 0 = throwM code
  | otherwise = throwM (IOError Nothing InvalidArgument "exitWith" "ExitFailure 0" Nothing Nothing)


-- | A version of 'System.Exit.exitFailure' available in any 'MonadThrow' context.
--   See 'System.Exit.exitFailure' for details
exitFailure :: MonadThrow m => m a
exitFailure = exitWith (ExitFailure 1)


-- | A version of 'System.Exit.exitSuccess' available in any 'MonadThrow' context.
--   See 'System.Exit.exitSuccess' for details
exitSuccess :: MonadThrow m => m a
exitSuccess = exitWith ExitSuccess