universum-0.1.12: 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
-- * Concurrency and parallelism
, myThreadId
, getNumCapabilities
, setNumCapabilities
, threadCapability
, isCurrentThreadBound
, mkWeakThreadId
, atomically
) where
import Control.Concurrent (ThreadId)
#if ( __GLASGOW_HASKELL__ >= 710 )
import Control.Monad.ST (RealWorld, ST)
#else
import Control.Monad.ST.Safe (RealWorld, ST)
#endif
import Control.Monad.STM (STM)
import Control.Monad.Trans (MonadIO, liftIO)
import Data.String (String)
import Data.Text (Text)
import Prelude (Bool, FilePath, Int, (>>))
import System.Exit (ExitCode)
import System.IO (Handle, IOMode, stderr)
import qualified System.IO (hPutStrLn)
import System.Mem.Weak (Weak)
-- 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
-- Concurrency and parallelism
import qualified Control.Concurrent as XIO
import qualified Control.Monad.STM as XIO
----------------------------------------------------------------------------
-- 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 #-}
----------------------------------------------------------------------------
-- Concurrency and parallelism
----------------------------------------------------------------------------
myThreadId :: MonadIO m => m ThreadId
myThreadId = liftIO XIO.myThreadId
{-# INLINABLE myThreadId #-}
getNumCapabilities :: MonadIO m => m Int
getNumCapabilities = liftIO XIO.getNumCapabilities
{-# INLINABLE getNumCapabilities #-}
setNumCapabilities :: MonadIO m => Int -> m ()
setNumCapabilities a = liftIO (XIO.setNumCapabilities a)
{-# INLINABLE setNumCapabilities #-}
threadCapability :: MonadIO m => ThreadId -> m (Int, Bool)
threadCapability a = liftIO (XIO.threadCapability a)
{-# INLINABLE threadCapability #-}
isCurrentThreadBound :: MonadIO m => m Bool
isCurrentThreadBound = liftIO XIO.isCurrentThreadBound
{-# INLINABLE isCurrentThreadBound #-}
mkWeakThreadId :: MonadIO m => ThreadId -> m (Weak ThreadId)
mkWeakThreadId a = liftIO (XIO.mkWeakThreadId a)
{-# INLINABLE mkWeakThreadId #-}
atomically :: MonadIO m => STM a -> m a
atomically a = liftIO (XIO.atomically a)
{-# INLINABLE atomically #-}