universum-0.3: src/Lifted.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE ExplicitNamespaces #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE Safe #-}
module Lifted
( -- * Text
appendFile
, getContents
, getLine
, interact
, readFile
, writeFile
-- * IO
, getArgs
, openFile
, exitWith
, exitFailure
, exitSuccess
, die
-- * ST
, stToIO
) where
#if ( __GLASGOW_HASKELL__ >= 710 )
import Control.Monad.ST (RealWorld, ST)
#else
import Control.Monad.ST.Safe (RealWorld, ST)
#endif
import Control.Monad.Trans (MonadIO, liftIO)
import Data.String (String)
import Data.Text (Text)
import Prelude (FilePath, (>>))
import System.Exit (ExitCode)
import System.IO (Handle, IOMode, stderr)
import qualified System.IO (hPutStrLn)
-- Text
import qualified Data.Text.IO as XIO
-- IO
import qualified System.Environment as XIO
import qualified System.Exit as XIO
import qualified System.IO as XIO (openFile)
-- ST
#if ( __GLASGOW_HASKELL__ >= 710 )
import qualified Control.Monad.ST as XIO
#else
import qualified Control.Monad.ST.Safe as XIO
#endif
----------------------------------------------------------------------------
-- Text
----------------------------------------------------------------------------
appendFile :: MonadIO m => FilePath -> Text -> m ()
appendFile a b = liftIO (XIO.appendFile a b)
{-# INLINABLE appendFile #-}
getContents :: MonadIO m => m Text
getContents = liftIO XIO.getContents
{-# INLINABLE getContents #-}
getLine :: MonadIO m => m Text
getLine = liftIO XIO.getLine
{-# INLINABLE getLine #-}
interact :: MonadIO m => (Text -> Text) -> m ()
interact a = liftIO (XIO.interact a)
{-# INLINABLE interact #-}
readFile :: MonadIO m => FilePath -> m Text
readFile a = liftIO (XIO.readFile a)
{-# INLINABLE readFile #-}
writeFile :: MonadIO m => FilePath -> Text -> m ()
writeFile a b = liftIO (XIO.writeFile a b)
{-# INLINABLE writeFile #-}
----------------------------------------------------------------------------
-- IO
----------------------------------------------------------------------------
getArgs :: MonadIO m => m [String]
getArgs = liftIO (XIO.getArgs)
{-# INLINABLE getArgs #-}
openFile :: MonadIO m => FilePath -> IOMode -> m Handle
openFile a b = liftIO (XIO.openFile a b)
{-# INLINABLE openFile #-}
-- 'withFile' can't be lifted into 'MonadIO', as it uses 'bracket'
exitWith :: MonadIO m => ExitCode -> m a
exitWith a = liftIO (XIO.exitWith a)
{-# INLINABLE exitWith #-}
exitFailure :: MonadIO m => m a
exitFailure = liftIO XIO.exitFailure
{-# INLINABLE exitFailure #-}
exitSuccess :: MonadIO m => m a
exitSuccess = liftIO XIO.exitSuccess
{-# INLINABLE exitSuccess #-}
-- 'die' is available since base-4.8, but it's more convenient to
-- redefine it instead of using CPP
die :: MonadIO m => String -> m ()
die err = liftIO (System.IO.hPutStrLn stderr err) >> exitFailure
{-# INLINABLE die #-}
----------------------------------------------------------------------------
-- ST
----------------------------------------------------------------------------
stToIO :: MonadIO m => ST RealWorld a -> m a
stToIO a = liftIO (XIO.stToIO a)
{-# INLINABLE stToIO #-}