language-elm-0.0.9.0: src/Elm/Type.hs
{-# OPTIONS_HADDOCK prune #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Ast for declaring types
module Elm.Type where
import Elm.Expression
import Text.PrettyPrint
import Data.Maybe
-- | Data type to represent types
data TypeDec
-- | A type with type paramaters
= Params String [TypeDec]
-- | A function type
| TApp [TypeDec]
-- | A two tuple type
| TTuple2 TypeDec TypeDec
-- | A record type
| TRecord (Maybe String) [(String, TypeDec)]
-- | Shortcut for declaring a type variable
tvar :: String -> TypeDec
tvar str =
Params str []
vopTApp :: TypeDec -> Doc
vopTApp t =
case t of
Params str types ->
toDocT $ Params str types
TRecord main decs ->
toDocT $ TRecord main decs
_ ->
parens $ toDocT t
vopParam :: TypeDec -> Doc
vopParam t =
case t of
Params str [] ->
text str
_ ->
parens $ toDocT t
toDocT :: TypeDec -> Doc
toDocT t =
case t of
Params p decs ->
text p <+> (hsep . map vopParam $ decs)
TApp types ->
hsep . punctuate (text " ->") . map vopTApp $ types
TTuple2 t1 t2 ->
lparen <> toDocT t1 <> comma <+> toDocT t2 <> rparen
TRecord Nothing [] ->
"{}"
TRecord (Just main) [] ->
text main
TRecord main decs ->
let
front = fmap (\x -> text x <+> "|") main
in
"{" <+> Data.Maybe.fromMaybe empty front
<+> (hsep . punctuate "," . map docDec $ decs)
<+> "}"
where
docDec (name, dec) =
text name <+> ":" <+> toDocT dec