    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