{-# OPTIONS_GHC -Wall #-}
module Transform.Definition where

import Control.Applicative ((<$>))
import qualified SourceSyntax.Pattern as P
import SourceSyntax.Expression
import qualified Transform.Expression as Expr

combineAnnotations :: [ParseDef] -> Either String [Def]
combineAnnotations = go
    where
      msg x = "Syntax Error: The type annotation for '" ++ x ++
              "' must be directly above its definition."

      exprCombineAnnotations = Expr.crawlLet combineAnnotations

      go defs =
          case defs of
            TypeAnnotation name tipe : Def pat@(P.Var name') expr : rest | name == name' ->
                do expr' <- exprCombineAnnotations expr
                   let def = Definition pat expr' (Just tipe)
                   (:) def <$> go rest

            TypeAnnotation name _  : _ -> Left (msg name)

            Def pat expr : rest ->
                do expr' <- exprCombineAnnotations expr
                   let def = Definition pat expr' Nothing
                   (:) def <$> go rest

            [] -> return []