on 357dedf help sign in
elk/src/Transform/Definition.hs
40 lines 1.3 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Transform.Definition where
4import Control.Applicative ((<$>))
5import qualified AST.Pattern as P
6import qualified AST.Expression.Source as Source
7import qualified AST.Expression.Valid as Valid
8import qualified Transform.Expression as Expr
10combineAnnotations :: [Source.Def] -> Either String [Valid.Def]
11combineAnnotations =
12 go
13 where
14 errorMessage x =
15 "Syntax Error: The type annotation for '" ++ x ++
16 "' must be directly above its definition."
18 exprCombineAnnotations =
19 Expr.crawlLet combineAnnotations
21 go defs =
22 case defs of
23 Source.TypeAnnotation name tipe : rest ->
24 case rest of
25 Source.Definition pat@(P.Var name') expr : rest'
26 | name == name' ->
27 do expr' <- exprCombineAnnotations expr
28 let def = Valid.Definition pat expr' (Just tipe)
29 (:) def <$> go rest'
31 _ ->
32 Left (errorMessage name)
34 Source.Definition pat expr : rest ->
35 do expr' <- exprCombineAnnotations expr
36 let def = Valid.Definition pat expr' Nothing
37 (:) def <$> go rest
39 [] ->
40 return []