2013-08-19 23:54:46 +00:00
|
|
|
-- This module contains checks to be run *after* type inference has
|
|
|
|
-- completed successfully. At that point we still need to do occurs
|
|
|
|
-- checks and ensure that `main` has an acceptable type.
|
2013-08-20 00:47:37 +00:00
|
|
|
module Type.ExtraChecks (extraChecks) where
|
2013-08-19 23:54:46 +00:00
|
|
|
|
|
|
|
import qualified Data.Map as Map
|
|
|
|
import Type.State (Env)
|
2013-08-20 00:47:37 +00:00
|
|
|
import Type.PrettyPrint ( pretty, ParensWhen(Never) )
|
|
|
|
import Text.PrettyPrint as P
|
2013-08-19 23:54:46 +00:00
|
|
|
|
2013-08-20 00:47:37 +00:00
|
|
|
extraChecks :: Env -> Either [P.Doc] Env
|
|
|
|
extraChecks env = occursCheck =<< mainCheck env
|
|
|
|
|
|
|
|
mainCheck :: Env -> Either [P.Doc] Env
|
2013-08-19 23:54:46 +00:00
|
|
|
mainCheck env =
|
|
|
|
case Map.lookup "main" env of
|
2013-08-20 00:47:37 +00:00
|
|
|
Nothing -> Right env
|
|
|
|
Just var
|
|
|
|
| P.render (pretty Never var) `elem` ["Element","Signal Element"] -> Right env
|
|
|
|
| otherwise ->
|
|
|
|
Left [ P.vcat [ P.text "Type Error:"
|
|
|
|
, P.text "'main' must be an Element or a (Signal Element)" ] ]
|
2013-08-19 23:54:46 +00:00
|
|
|
|
2013-08-20 00:47:37 +00:00
|
|
|
occursCheck :: Env -> Either [P.Doc] Env
|
|
|
|
occursCheck env = return env
|