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