module Elm.Program where
import Protolude hiding (join)
import Control.Monad.Writer hiding (join)
import Data.List hiding (map)
import Data.String
import Data.String.Utils
import Elm.Classes
import Elm.Decleration
import Elm.GenError
import Elm.Import
import Text.PrettyPrint
data Program = Program String ImportType [Import] [Dec]
instance Generate Program where
generate (Program name exports imports declerations) = do
exportDoc <- generate exports
importDocs <- mapM generate imports
decDocs <- mapM generate declerations
return $ "module" <+> text name <+> "exposing" <+> exportDoc $+$
vcat importDocs $+$
vcat decDocs
renderProgram :: Program -> (String, GenError)
renderProgram program =
let
(doc, parseError) = runWriter $ generate program
str = render doc
in
((join "\n" . map addNewline . split "\n" $ str)++"\n", parseError)
where
addNewline line =
if (or $ map (\s -> isInfixOf s line) [":", "type"]) then
"\n\n" ++ line
else
line