module Agda.Utils.IO.UTF8
  ( readTextFile
  , Agda.Utils.IO.UTF8.writeFile
  , writeTextToFile
  ) where
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as T
import qualified System.IO as IO
convertLineEndings :: Text -> Text
convertLineEndings = T.map convert
  where
  
  convert '\x000D' = '\n'  
  convert '\x000C' = '\n'  
  
  convert '\x0085' = '\n'  
  convert '\x2028' = '\n'  
  convert '\x2029' = '\n'  
  
  convert c        = c
readTextFile :: FilePath -> IO Text
readTextFile file = convertLineEndings <$> do
  h <- IO.openFile file IO.ReadMode
  IO.hSetNewlineMode h $
    IO.NewlineMode { IO.inputNL = IO.CRLF, IO.outputNL = IO.LF }
  IO.hSetEncoding h IO.utf8
  T.hGetContents h
writeFile :: FilePath -> String -> IO ()
writeFile file s = IO.withFile file IO.WriteMode $ \h -> do
  IO.hSetEncoding h IO.utf8
  IO.hPutStr h s
writeTextToFile :: FilePath -> Text -> IO ()
writeTextToFile file s = IO.withFile file IO.WriteMode $ \h -> do
  IO.hSetEncoding h IO.utf8
  T.hPutStr h s