%
% Copyright (C) 1997 Thomas Nordin and Alastair Reid
%
\begin{code}
module Decl
( Decl(..)
, Sig
, Call
, CCode
, Fail
, Result
, showDecls
) where
import Name( Name )
import DIS ( DIS, ppDIS' )
import Type( Type, ppType )
import Pretty
-- #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 202
-- import PrelBase(maybe) -- workaround for GHC 2.02
-- #endif
\end{code}
\begin{code}
data Decl
= ProcSpec Sig (Maybe Call) (Maybe CCode) (Maybe Fail) (Maybe Result)
| Haskell String
| C String
| DisDef Name [Name] DIS
| Constant Type [(Name, Name)] -- Haskell, C name
| Prefix Name
| Include Name
deriving ( Show )
type Sig = (Name, Type)
type Call = [DIS]
type CCode = [String]
type Fail = [(String, String)]
type Result = DIS
\end{code}
\begin{code}
showDecls :: Maybe [Decl] -> String
showDecls n@Nothing = show n
showDecls (Just ds) = unlines (map show ds)
ppMain :: Decl -> Doc
ppMain (ProcSpec (n, t) mbcall mbcode mbfail mbres)
= text "%fun" <+> text n <+> text "::" <+> ppType t
$$ (maybe empty (\ds -> text "%call" <+> hsep (map (ppDIS' True) ds)) mbcall)
$$ (maybe empty (\cexp -> text "%code" <+> prefix "% " cexp) mbcode)
$$ (maybe empty (\fs -> hsep (map (\(a, b) -> text "%fail" <+> braces (text a) <+> braces (text b)) fs)) mbfail)
$$ (maybe empty (\d -> text "%result" <+> ppDIS' True d) mbres)
$$ text "\n"
ppMain x = empty
prefix :: String -> [String] -> Doc
prefix pre = foldl (\x y-> x $$ text pre <> text y) empty
\end{code}
|