{-# OPTIONS_GHC -Wall #-} module Transform.Definition where import Control.Applicative ((<$>)) import qualified AST.Pattern as P import qualified AST.Expression.Source as Source import qualified AST.Expression.Valid as Valid import qualified Transform.Expression as Expr combineAnnotations :: [Source.Def] -> Either String [Valid.Def] combineAnnotations = go where errorMessage x = "Syntax Error: The type annotation for '" ++ x ++ "' must be directly above its definition." exprCombineAnnotations = Expr.crawlLet combineAnnotations go defs = case defs of Source.TypeAnnotation name tipe : rest -> case rest of Source.Definition pat@(P.Var name') expr : rest' | name == name' -> do expr' <- exprCombineAnnotations expr let def = Valid.Definition pat expr' (Just tipe) (:) def <$> go rest' _ -> Left (errorMessage name) Source.Definition pat expr : rest -> do expr' <- exprCombineAnnotations expr let def = Valid.Definition pat expr' Nothing (:) def <$> go rest [] -> return []