implementation module sem
-import StdMisc
+import qualified Data.Map as Map
-semanticAnalysis :: AST -> Either Error AST
-semanticAnalysis a =
+from Data.Func import $
+from StdFunc import o
+
+import Data.Either
+
+import StdString
+import StdList
+import StdEnum
+import RWST
+import GenEq
+
+from Text import class Text(concat), instance Text String
+
+import AST
+
+:: Gamma :== 'Map'.Map String Type
+:: Constraint :== String
+:: Infer a :== RWST [String] [Constraint] Gamma (Either SemError) a
+:: SemError
+ = ParseError Pos String
+ | UnifyError Pos Type Type
+ | FieldSelectorError Pos Type FieldSelector
+ | OperatorError Pos Op2 Type
+ | UndeclaredVariableError Pos String
+ | ArgumentMisMatchError Pos String
+ | Error String
+
+variableStream :: [String]
+variableStream = map toString [1..]
+
+sem :: AST -> SemOutput
+sem (AST vd fd) = Right $ (AST vd fd, 'Map'.newMap)
+
+instance toString Gamma where
+ toString mp = concat [concat [k, ": ", toString v, "\n"]\\(k, v)<-'Map'.toList mp]
+
+instance toString SemError where
+ toString se = "SemError: "