io-streams-1.0.0.0: src/System/IO/Streams/Handle.hs
{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Trustworthy #-}
#endif
-- | Input and output streams for file 'Handle's.
module System.IO.Streams.Handle
( -- * Handle conversions
handleToInputStream
, handleToOutputStream
, stdin
, stdout
, stderr
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString as S
import System.IO (Handle, hFlush)
import qualified System.IO as IO
import System.IO.Unsafe (unsafePerformIO)
------------------------------------------------------------------------------
import System.IO.Streams.Internal (InputStream, OutputStream,
lockingInputStream,
lockingOutputStream,
makeInputStream,
makeOutputStream)
------------------------------------------------------------------------------
bUFSIZ :: Int
bUFSIZ = 32752
------------------------------------------------------------------------------
-- | Converts a read-only handle into an 'InputStream' of strict 'ByteString's.
handleToInputStream :: Handle -> IO (InputStream ByteString)
handleToInputStream h = makeInputStream f
where
f = do
x <- S.hGetSome h bUFSIZ
return $! if S.null x then Nothing else Just x
------------------------------------------------------------------------------
-- | Converts a writable handle into an 'OutputStream' of strict 'ByteString's.
handleToOutputStream :: Handle -> IO (OutputStream ByteString)
handleToOutputStream h = makeOutputStream f
where
f Nothing = return $! ()
f (Just x) = if S.null x
then hFlush h
else S.hPut h x
------------------------------------------------------------------------------
-- | An 'InputStream' for 'IO.stdin'.
stdin :: InputStream ByteString
stdin = unsafePerformIO (handleToInputStream IO.stdin >>= lockingInputStream)
{-# NOINLINE stdin #-}
------------------------------------------------------------------------------
-- | An 'OutputStream' for 'IO.stdout'.
stdout :: OutputStream ByteString
stdout = unsafePerformIO (handleToOutputStream IO.stdout >>=
lockingOutputStream)
{-# NOINLINE stdout #-}
------------------------------------------------------------------------------
-- | An 'OutputStream' for 'IO.stderr'.
stderr :: OutputStream ByteString
stderr = unsafePerformIO (handleToOutputStream IO.stderr >>=
lockingOutputStream)
{-# NOINLINE stderr #-}