    {-# LANGUAGE CPP #-}

    -- | Text IO using the UTF8 character encoding.

    module Agda.Utils.IO.UTF8
      ( readTextFile
      , Agda.Utils.IO.UTF8.writeFile
      ) where

    #if MIN_VERSION_base(4,2,0)
    import qualified System.IO as IO
    #else
    import qualified System.IO.UTF8 as UTF8
    #endif
    import Control.Applicative

    import Agda.Utils.Unicode

    -- | Reads a UTF8-encoded text file and converts all Unicode line
    -- endings into '\n'.

    readTextFile :: FilePath -> IO String
    readTextFile file = convertLineEndings <$> do
    #if MIN_VERSION_base(4,2,0)
      h <- IO.openFile file IO.ReadMode
      IO.hSetNewlineMode h IO.noNewlineTranslation
      IO.hSetEncoding h IO.utf8
      IO.hGetContents h
    #else
      UTF8.readFile file
    #endif

    -- | Writes a UTF8-encoded text file. The native convention for line
    -- endings is used.

    writeFile :: FilePath -> String -> IO ()
    #if MIN_VERSION_base(4,2,0)
    writeFile file s = IO.withFile file IO.WriteMode $ \h -> do
      IO.hSetEncoding h IO.utf8
      IO.hPutStr h s
    #else
    writeFile = UTF8.writeFile
    #endif