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.Map as Map
7import qualified Data.List as List
10import qualified AST.Pattern as P
11import qualified AST.Variable as Var
12import qualified Reporting.Annotation as A
13import qualified Reporting.Error.Type as Error
15import qualified Type.Constrain.Literal as Literal
16import qualified Type.Environment as Env
26 { _headers :: Map.Map Text (A.Located Type)
34 Info Map.empty [] CTrue
37joinInfo :: Info -> Info -> Info
38joinInfo (Info headers1 vars1 cons1) (Info headers2 vars2 cons2) =
40 { _headers = Map.union headers1 headers2
41 , _vars = vars1 ++ vars2
42 , _cons = cons1 /\ cons2
46joinInfos :: [Info] -> Info
48 List.foldl' (flip joinInfo) emptyInfo infos
51infoToScheme :: Info -> Scheme
52infoToScheme (Info headers vars cons) =
53 Scheme [] vars cons headers
60constrain :: Env.Env -> P.Canonical -> Type -> IO Info
61constrain env (A.A region pattern) tipe =
63 equal patternError leftType rightType =
64 CEqual (Error.Pattern patternError) region leftType rightType
74 do c <- Literal.constrain region lit tipe
75 return $ emptyInfo { _cons = c }
78 do variable <- mkFlexVar
80 { _headers = Map.singleton name (rvar variable)
82 , _cons = equal (Error.PVar name) (VarN variable) tipe
86 do variable <- mkFlexVar
87 info <- constrain env ptrn tipe
89 { _headers = Map.insert name (rvar variable) (_headers info)
90 , _vars = variable : _vars info
92 equal (Error.PAlias name) (VarN variable) tipe
96 P.Ctor name patterns ->
97 do (_kind, cvars, args, result) <-
98 Env.freshDataScheme env (Var.toText name)
100 fragList <- Monad.zipWithM (constrain env) patterns args
101 let info = joinInfos fragList
103 { _vars = cvars ++ _vars info
105 equal (Error.PCtor name) result tipe
111 mapM (\name -> (,) name <$> mkFlexVar) fields
114 Map.fromList (map (second rvar) pairs)
116 let unannotatedTenv =
119 con <- exists $ \t ->
120 return (equal Error.PRecord tipe (RecordN 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