{-# OPTIONS_HADDOCK prune #-} -- | Top level declerations module Elm.Decleration where import Elm.Type import Elm.Expression import Text.PrettyPrint -- | Used to declare functions, variables, and types data Dec -- | Declare a function = Dec String TypeDec [Expr] Expr -- | Declare a type | DecType String [String] [(String, [TypeDec])] -- | Declare a type alias | DecTypeAlias String [String] TypeDec toDocD :: Dec -> Doc toDocD dec = case dec of Dec str typeDec args body -> text str <+> text "::" <+> toDocT typeDec $+$ hang (text str <+> (hsep . map toDoc $ args) <+> text "=") 4 (toDoc body) DecTypeAlias str typeParams t-> text "type alias" <+> text str <+> (hsep . map text $ typeParams) <+> text "=" <+> toDocT t DecType str typeParams types -> text "type" <+> text str <+> (hsep . map text $ typeParams) <+> text "=" <+> (hsep . punctuate (text " |") . map toDec $ types) where toDec (str, t) = text str <+> (hsep . map vopParam $ t)