base-compat-0.11.2: src/System/IO/Compat.hs
{-# LANGUAGE CPP, NoImplicitPrelude #-}
module System.IO.Compat (
module Base
, getContents'
, hGetContents'
, readFile'
) where
import System.IO as Base
#if !(MIN_VERSION_base(4,15,0))
import Prelude.Compat
-- | The 'getContents'' operation returns all user input as a single string,
-- which is fully read before being returned
-- (same as 'hGetContents'' 'stdin').
--
-- /Since: 4.15.0.0/
getContents' :: IO String
getContents' = hGetContents' stdin
-- | The 'readFile'' function reads a file and
-- returns the contents of the file as a string.
-- The file is fully read before being returned, as with 'getContents''.
--
-- /Since: 4.15.0.0/
readFile' :: FilePath -> IO String
readFile' name = openFile name ReadMode >>= hGetContents'
-- | The 'hGetContents'' operation reads all input on the given handle
-- before returning it as a 'String' and closing the handle.
--
-- /Since: 4.15.0.0/
hGetContents' :: Handle -> IO String
hGetContents' h = hGetContents h >>= \s -> length s `seq` return s
-- NB: The actual implementation of hGetContents' in `base` uses a lot of
-- low-level code from GHC.IO.Handle.Text. What's worse, a lot of this
-- low-level code isn't exported, so we'd have to reimplement large chunks
-- of it in base-compat if we wanted to backport it. For now, I've opted for
-- the simpler approach of simply defining hGetContents' in terms of
-- hGetContents, which is the approach that the `extra` and `strict` libraries
-- use. (Indeed, the code above is taken from `strict`.)
#endif