{-# LANGUAGE PackageImports #-}
{-# LANGUAGE Safe           #-}

module System.Exit (
      ExitCode(ExitSuccess,ExitFailure)
    , exitWith      -- :: ExitCode -> IO a
    , exitFailure   -- :: IO a
    , exitSuccess   -- :: IO a
  ) where
import           "base" System.Exit hiding (exitWith)
import qualified "base" System.Exit as Base

-- SDM: use the Haskell 98 docs for exitWith, since the base docs talk
-- about exceptions which aren't in Haskell 2010.

-- SDM: removed:
-- Before the program terminates, any open or semi-closed handles are
-- first closed.

-- SDM: removed:
-- If a program terminates as a result of calling @error@\indextt{error} or
-- because its value is otherwise determined to be "\bot"\index{"\bot"}, then it
-- is treated identically to the computation @exitFailure@.  Otherwise, if any
-- program "p" terminates without calling @exitWith@ explicitly, it is treated
-- identically to the computation
-- \bprog
-- @(@"p"@ >> exitWith ExitSuccess) `catch` \ _ -> exitFailure@
-- \eprog

{- |
Computation @'exitWith' code@ terminates the program, returning @code@
to the program's caller.
The caller may interpret the return code as it wishes, but the program
should return 'ExitSuccess' to mean normal completion, and
@'ExitFailure' n@ to mean that the program encountered a problem from
which it could not recover.  The value 'exitFailure' is equal to
@'exitWith' ('ExitFailure' exitfail)@, where @exitfail@ is
implementation-dependent.  'exitWith' bypasses the error handling in
the I/O monad and cannot be intercepted by 'catch' from the @Prelude@.
-}
exitWith :: ExitCode -> IO a
exitWith = Base.exitWith