curry-base-1.1.1: src/Curry/AbstractCurry/Files.hs
{- |
Module : $Header$
Description : Library to support meta-programming in Curry
Copyright : (c) Michael Hanus , 2004
Martin Engelke , 2005
Björn Peemöller, 2014
Finn Teegen , 2016
License : BSD-3-clause
Maintainer : bjp@informatik.uni-kiel.de
Stability : experimental
Portability : portable
This library contains I/O actions to read Curry programs
and transform them into this abstract representation as well as
write them to a file.
-}
module Curry.AbstractCurry.Files
( readCurry, writeCurry, showCurry
) where
import qualified Control.Exception as C (catch)
import Data.List (intercalate)
import Curry.Files.PathUtils ( writeModule, readModule
, addVersion, checkVersion)
import Curry.AbstractCurry.Type
-- ---------------------------------------------------------------------------
-- Reading and writing AbstractCurry terms
-- ---------------------------------------------------------------------------
-- |Read an AbstractCurry file and return the corresponding AbstractCurry
-- program term of type 'CurryProg'
readCurry :: FilePath -> IO (Maybe CurryProg)
readCurry fn = do
mbSrc <- readModule fn
return $ case mbSrc of
Nothing -> Nothing
Just src -> case checkVersion version src of
Left _ -> Nothing
Right ac -> Just (read ac)
-- |Write an AbstractCurry program term into a file.
writeCurry :: FilePath -> CurryProg -> IO ()
writeCurry fn p = C.catch (writeModule fn $ addVersion version $ showCurry p)
ioError
-- |Show an AbstractCurry program in a nicer way
showCurry :: CurryProg -> String
showCurry (CurryProg mname imps dflt clss insts types funcs ops)
= "CurryProg " ++ show mname ++ "\n"
++ show imps ++ "\n"
++ showsPrec 11 dflt "\n"
++ wrapList clss
++ wrapList insts
++ wrapList types
++ wrapList funcs
++ wrapList ops
where wrapList xs = " [" ++ intercalate ",\n " (map show xs) ++ "]\n"