1-- | Unlifted "System.IO". 2-- 3-- @since 0.1.0.0 4module UnliftIO.IO 5 ( IOMode (..) 6 , Handle 7 , IO.stdin 8 , IO.stdout 9 , IO.stderr 10 , withFile 11 , withBinaryFile 12 , hClose 13 , hFlush 14 , hFileSize 15 , hSetFileSize 16 , hIsEOF 17 , IO.BufferMode (..) 18 , hSetBuffering 19 , hGetBuffering 20 , hSeek 21 , IO.SeekMode (..) 22 , hTell 23 , hIsOpen 24 , hIsClosed 25 , hIsReadable 26 , hIsWritable 27 , hIsSeekable 28 , hIsTerminalDevice 29 , hSetEcho 30 , hGetEcho 31 , hWaitForInput 32 , hReady 33 , getMonotonicTime 34 ) where 35 36import qualified System.IO as IO 37import System.IO (Handle, IOMode (..)) 38import Control.Monad.IO.Unlift 39 40import System.IO.Unsafe (unsafePerformIO) 41 42-- | Unlifted version of 'IO.withFile'. 43-- 44-- @since 0.1.0.0 45withFile :: MonadUnliftIO m => FilePath -> IOMode -> (Handle -> m a) -> m a 46withFile fp mode inner = withRunInIO $ \run -> IO.withFile fp mode $ run . inner 47 48-- | Unlifted version of 'IO.withBinaryFile'. 49-- 50-- @since 0.1.0.0 51withBinaryFile :: MonadUnliftIO m => FilePath -> IOMode -> (Handle -> m a) -> m a 52withBinaryFile fp mode inner = withRunInIO $ \run -> IO.withBinaryFile fp mode $ run . inner 53 54-- | Lifted version of 'IO.hClose' 55-- 56-- @since 0.2.1.0 57hClose :: MonadIO m => Handle -> m () 58hClose = liftIO . IO.hClose 59 60-- | Lifted version of 'IO.hFlush' 61-- 62-- @since 0.2.1.0 63hFlush :: MonadIO m => Handle -> m () 64hFlush = liftIO . IO.hFlush 65 66-- | Lifted version of 'IO.hFileSize' 67-- 68-- @since 0.2.1.0 69hFileSize :: MonadIO m => Handle -> m Integer 70hFileSize = liftIO . IO.hFileSize 71 72-- | Lifted version of 'IO.hSetFileSize' 73-- 74-- @since 0.2.1.0 75hSetFileSize :: MonadIO m => Handle -> Integer -> m () 76hSetFileSize h = liftIO . IO.hSetFileSize h 77 78-- | Lifted version of 'IO.hIsEOF' 79-- 80-- @since 0.2.1.0 81hIsEOF :: MonadIO m => Handle -> m Bool 82hIsEOF = liftIO . IO.hIsEOF 83 84-- | Lifted version of 'IO.hSetBuffering' 85-- 86-- @since 0.2.1.0 87hSetBuffering :: MonadIO m => Handle -> IO.BufferMode -> m () 88hSetBuffering h = liftIO . IO.hSetBuffering h 89 90-- | Lifted version of 'IO.hGetBuffering' 91-- 92-- @since 0.2.1.0 93hGetBuffering :: MonadIO m => Handle -> m IO.BufferMode 94hGetBuffering = liftIO . IO.hGetBuffering 95 96-- | Lifted version of 'IO.hSeek' 97-- 98-- @since 0.2.1.0 99hSeek :: MonadIO m => Handle -> IO.SeekMode -> Integer -> m () 100hSeek h s = liftIO . IO.hSeek h s 101 102-- | Lifted version of 'IO.hTell' 103-- 104-- @since 0.2.1.0 105hTell :: MonadIO m => Handle -> m Integer 106hTell = liftIO . IO.hTell 107 108-- | Lifted version of 'IO.hIsOpen' 109-- 110-- @since 0.2.1.0 111hIsOpen :: MonadIO m => Handle -> m Bool 112hIsOpen = liftIO . IO.hIsOpen 113 114-- | Lifted version of 'IO.hIsClosed' 115-- 116-- @since 0.2.1.0 117hIsClosed :: MonadIO m => Handle -> m Bool 118hIsClosed = liftIO . IO.hIsClosed 119 120-- | Lifted version of 'IO.hIsReadable' 121-- 122-- @since 0.2.1.0 123hIsReadable :: MonadIO m => Handle -> m Bool 124hIsReadable = liftIO . IO.hIsReadable 125 126-- | Lifted version of 'IO.hIsWritable' 127-- 128-- @since 0.2.1.0 129hIsWritable :: MonadIO m => Handle -> m Bool 130hIsWritable = liftIO . IO.hIsWritable 131 132-- | Lifted version of 'IO.hIsSeekable' 133-- 134-- @since 0.2.1.0 135hIsSeekable :: MonadIO m => Handle -> m Bool 136hIsSeekable = liftIO . IO.hIsSeekable 137 138-- | Lifted version of 'IO.hIsTerminalDevice' 139-- 140-- @since 0.2.1.0 141hIsTerminalDevice :: MonadIO m => Handle -> m Bool 142hIsTerminalDevice = liftIO . IO.hIsTerminalDevice 143 144-- | Lifted version of 'IO.hSetEcho' 145-- 146-- @since 0.2.1.0 147hSetEcho :: MonadIO m => Handle -> Bool -> m () 148hSetEcho h = liftIO . IO.hSetEcho h 149 150-- | Lifted version of 'IO.hGetEcho' 151-- 152-- @since 0.2.1.0 153hGetEcho :: MonadIO m => Handle -> m Bool 154hGetEcho = liftIO . IO.hGetEcho 155 156-- | Lifted version of 'IO.hWaitForInput' 157-- 158-- @since 0.2.1.0 159hWaitForInput :: MonadIO m => Handle -> Int -> m Bool 160hWaitForInput h = liftIO . IO.hWaitForInput h 161 162-- | Lifted version of 'IO.hReady' 163-- 164-- @since 0.2.1.0 165hReady :: MonadIO m => Handle -> m Bool 166hReady = liftIO . IO.hReady 167 168-- | Get the number of seconds which have passed since an arbitrary starting 169-- time, useful for calculating runtime in a program. 170-- 171-- @since 0.2.3.0 172getMonotonicTime :: MonadIO m => m Double 173getMonotonicTime = liftIO $ initted `seq` getMonotonicTime' 174 175-- | Set up time measurement. 176foreign import ccall unsafe "unliftio_inittime" initializeTime :: IO () 177 178initted :: () 179initted = unsafePerformIO initializeTime 180{-# NOINLINE initted #-} 181 182foreign import ccall unsafe "unliftio_gettime" getMonotonicTime' :: IO Double 183