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
14import qualified Type.Constrain.Literal as Literal
15import qualified Type.Environment as Env
25 { _headers :: Map.Map Text (A.Located Type)
27 , _cons :: TypeConstraint
33 Info Map.empty [] CTrue
36joinInfo :: Info -> Info -> Info
37joinInfo (Info headers1 vars1 cons1) (Info headers2 vars2 cons2) =
39 { _headers = Map.union headers1 headers2
40 , _vars = vars1 ++ vars2
41 , _cons = cons1 /\ cons2
45joinInfos :: [Info] -> Info
47 List.foldl' (flip joinInfo) emptyInfo infos
50infoToScheme :: Info -> Scheme Type Variable
51infoToScheme (Info headers vars cons) =
52 Scheme [] vars cons headers
59constrain :: Env.Env -> P.Canonical -> Type -> IO Info
60constrain env (A.A region pattern) tipe =
62 equal patternError leftType rightType =
63 CEqual (Error.Pattern patternError) region leftType rightType
73 do c <- Literal.constrain env region lit tipe
74 return $ emptyInfo { _cons = c }
77 do variable <- mkVar Nothing
79 { _headers = Map.singleton name (rvar variable)
81 , _cons = equal (Error.PVar name) (VarN variable) tipe
85 do variable <- mkVar Nothing
86 info <- constrain env ptrn tipe
88 { _headers = Map.insert name (rvar variable) (_headers info)
89 , _vars = variable : _vars info
91 equal (Error.PAlias name) (VarN variable) tipe
95 P.Ctor name patterns ->
96 do (_kind, cvars, args, result) <-
97 Env.freshDataScheme env (Var.toText name)
99 fragList <- Monad.zipWithM (constrain env) patterns args
100 let info = joinInfos fragList
102 { _vars = cvars ++ _vars info
104 equal (Error.PCtor name) result tipe
110 mapM (\name -> (,) name <$> mkVar Nothing) fields
113 Map.fromList (map (second rvar) pairs)
115 let unannotatedTenv =
118 con <- exists $ \t ->
119 return (equal Error.PRecord tipe (record unannotatedTenv t))
123 , _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