module Curry.FlatCurry.Files
( readFlatCurry, readFlatInterface, writeFlatCurry
) where
import Control.Monad (liftM)
import Data.Char (isSpace)
import Data.List (intercalate)
import Curry.Files.Filenames (flatName, flatIntName)
import Curry.Files.PathUtils (writeModule, readModule)
import Curry.FlatCurry.Type (Prog (..))
readFlatCurry :: FilePath -> IO (Maybe Prog)
readFlatCurry = readFlat . flatName
readFlatInterface :: FilePath -> IO (Maybe Prog)
readFlatInterface = readFlat . flatIntName
readFlat :: FilePath -> IO (Maybe Prog)
readFlat = liftM (liftM (read . skipComment)) . readModule where
skipComment s = case dropWhile isSpace s of
'{' : '-' : s' -> dropComment s'
s' -> s'
dropComment ('-' : '}' : xs) = xs
dropComment (_ : xs) = dropComment xs
dropComment [] = []
writeFlatCurry :: FilePath -> Prog -> IO ()
writeFlatCurry fn = writeModule fn . showFlatCurry
showFlatCurry :: Prog -> String
showFlatCurry (Prog mname imps types funcs ops)
= "Prog " ++ show mname ++ "\n"
++ " " ++ show imps ++ "\n"
++ " [" ++ intercalate ",\n " (map show types) ++ "]\n"
++ " [" ++ intercalate ",\n " (map show funcs) ++ "]\n"
++ " " ++ show ops ++ "\n"