{-# LANGUAGE Safe #-}

-- | Lifted versions of functions that work with environment.

module Universum.Lifted.Env
       ( exitWith
       , exitFailure
       , exitSuccess
       , die
       ) where

import Control.Monad.Trans (MonadIO, liftIO)
import Data.String (String)
import Prelude ((>>))
import System.Exit (ExitCode)
import System.IO (stderr)

import qualified System.Exit as XIO
import qualified System.IO (hPutStrLn)

-- | Lifted version of 'System.Exit.exitWith'.
exitWith :: MonadIO m => ExitCode -> m a
exitWith :: forall (m :: * -> *) a. MonadIO m => ExitCode -> m a
exitWith ExitCode
a = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall a. ExitCode -> IO a
XIO.exitWith ExitCode
a)
{-# INLINE exitWith #-}

-- | Lifted version of 'System.Exit.exitFailure'.
exitFailure :: MonadIO m => m a
exitFailure :: forall (m :: * -> *) a. MonadIO m => m a
exitFailure = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a. IO a
XIO.exitFailure
{-# INLINE exitFailure #-}

-- | Lifted version of 'System.Exit.exitSuccess'.
exitSuccess :: MonadIO m => m a
exitSuccess :: forall (m :: * -> *) a. MonadIO m => m a
exitSuccess = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a. IO a
XIO.exitSuccess
{-# INLINE exitSuccess #-}

-- | Lifted version of 'System.Exit.die'.
-- 'XIO.die' is available since base-4.8, but it's more convenient to
-- redefine it instead of using CPP.
die :: MonadIO m => String -> m a
die :: forall (m :: * -> *) a. MonadIO m => String -> m a
die String
err = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Handle -> String -> IO ()
System.IO.hPutStrLn Handle
stderr String
err) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadIO m => m a
exitFailure
{-# INLINE die #-}