1{-# OPTIONS_GHC -Wall #-}
2module Type.Constrain.Pattern (Info(..), joinInfos, infoToScheme, constrain) where
4import Control.Arrow (second)
5import qualified Control.Monad as Monad
6import qualified Data.List as List
7import qualified Data.Map as Map
9import qualified AST.Pattern as P
10import qualified AST.Variable as V
11import qualified Reporting.Annotation as A
12import qualified Reporting.Error.Type as Error
13import qualified Type.Constrain.Literal as Literal
14import qualified Type.Environment as Env
24 { _headers :: Map.Map String (A.Located Type)
26 , _cons :: TypeConstraint
32 Info Map.empty [] CTrue
35joinInfo :: Info -> Info -> Info
36joinInfo (Info headers1 vars1 cons1) (Info headers2 vars2 cons2) =
38 { _headers = Map.union headers1 headers2
39 , _vars = vars1 ++ vars2
40 , _cons = cons1 /\ cons2
44joinInfos :: [Info] -> Info
46 List.foldl' (flip joinInfo) emptyInfo infos
49infoToScheme :: Info -> Scheme Type Variable
50infoToScheme (Info headers vars cons) =
51 Scheme [] vars cons headers
58constrain :: Env.Env -> P.Canonical -> Type -> IO Info
59constrain env (A.A region pattern) tipe =
61 equal patternError leftType rightType =
62 CEqual (Error.Pattern patternError) region leftType rightType
72 do c <- Literal.constrain env region lit tipe
73 return $ emptyInfo { _cons = c }
76 do variable <- mkVar Nothing
78 { _headers = Map.singleton name (rvar variable)
80 , _cons = equal (Error.PVar name) (VarN variable) tipe
84 do variable <- mkVar Nothing
85 info <- constrain env ptrn tipe
87 { _headers = Map.insert name (rvar variable) (_headers info)
88 , _vars = variable : _vars info
90 equal (Error.PAlias name) (VarN variable) tipe
94 P.Data name patterns ->
95 do let stringName = V.toString name
97 (_kind, cvars, args, result) <-
98 Env.freshDataScheme env stringName
100 fragList <- Monad.zipWithM (constrain env) patterns args
101 let info = joinInfos fragList
103 { _vars = cvars ++ _vars info
105 equal (Error.PData stringName) result tipe
111 mapM (\name -> (,) name <$> mkVar Nothing) fields
114 Map.fromList (map (second rvar) pairs)
116 let unannotatedTenv =
119 con <- exists $ \t ->
120 return (equal Error.PRecord tipe (record unannotatedTenv t))
124 , _vars = map snd pairs
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list