@@ -1,15 +1,25 @@
11-- This module contains checks to be run *after* type inference has
22-- completed successfully. At that point we still need to do occurs
33-- checks and ensure that `main` has an acceptable type.
4−module Type.ExtraChecks where
4+module Type.ExtraChecks (extraChecks) where
55
66import qualified Data.Map as Map
77import Type.State (Env)
8+import Type.PrettyPrint ( pretty, ParensWhen(Never) )
9+import Text.PrettyPrint as P
810
9−mainCheck :: Env -> IO (Either String Env)
11+extraChecks :: Env -> Either [P.Doc] Env
12+extraChecks env = occursCheck =<< mainCheck env
13+
14+mainCheck :: Env -> Either [P.Doc] Env
1015mainCheck env =
1116 case Map.lookup "main" env of
12− Nothing -> return (Right env)
13− Just var -> return (Right env)
17+ Nothing -> Right env
18+ Just var
19+ | P.render (pretty Never var) `elem` ["Element","Signal Element"] -> Right env
20+ | otherwise ->
21+ Left [ P.vcat [ P.text "Type Error:"
22+ , P.text "'main' must be an Element or a (Signal Element)" ] ]
1423
15−occursCheck = undefined
24+occursCheck :: Env -> Either [P.Doc] Env
25+occursCheck env = return env