on master help sign in
Simplify code to generate record constraints
commit576e9794839dca76fdcc40ee607a32ac880b2fbb authorEvan Czaplicki <info@elm-lang.org> dateSat 27 Jul 2013, 00:14 (13 years ago) parentab41d0c
3 files changed+17−23
compiler/SourceSyntax/Type.hs+1−1 compiler/Type/Constrain/Expression.hs+15−22 compiler/Type/Type.hs+1
compiler/SourceSyntax/Type.hs+1−1
@@ -16,7 +16,7 @@ data Type = Lambda Type Type
1616 | Record [(String,Type)] Type
1717 deriving (Eq, Show, Data, Typeable)
1818
19−fieldMap :: [(String,Type)] -> Map.Map String [Type]
19+fieldMap :: [(String,a)] -> Map.Map String [a]
2020fieldMap fields =
2121 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
2222
compiler/Type/Constrain/Expression.hs+15−22
@@ -108,31 +108,24 @@ constrain env (L _ _ expr) tipe =
108108
109109 Modify e fields ->
110110 exists $ \t -> do
111− dummyFields <- Map.fromList <$> mapM dummyField fields
112− cOld <- constrain env e (record dummyFields t)
113− (fieldTypes, constraints) <- unzip <$> mapM field fields
114− let cNew = tipe === record (Map.fromList fieldTypes) t
115− return (CAnd (cOld : cNew : constraints))
116− where
117− dummyField (label, _) = do
118− v <- var Flexible -- needs an ex
119− return (label, [VarN v])
111+ oldVars <- forM fields $ \_ -> var Flexible
112+ let oldFields = SrcT.fieldMap (zip (map fst fields) (map VarN oldVars))
113+ cOld <- ex oldVars <$> constrain env e (record oldFields t)
114+
115+ newVars <- forM fields $ \_ -> var Flexible
116+ let newFields = SrcT.fieldMap (zip (map fst fields) (map VarN newVars))
117+ let cNew = tipe === record newFields t
120118
121− field (label, value) = do
122− v <- var Flexible -- needs an ex
123− c <- ex [v] <$> constrain env value (VarN v)
124− return ((label, [VarN v]), c)
119+ cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
120+
121+ return $ cOld /\ ex newVars (CAnd (cNew : cs))
125122
126123 Record fields ->
127− do (pairs, cs) <- unzip <$> mapM field fields
128− let fieldTypes = Map.fromList (map (second (\t -> [VarN t])) pairs)
129− recordType = record fieldTypes (TermN EmptyRecord1)
130− return $ ex (map snd pairs) (CAnd (tipe === recordType : cs))
131− where
132− field (name, body) = do
133− v <- var Flexible -- needs an ex
134− c <- constrain env body (VarN v)
135− return ((name, v), c)
124+ do vars <- forM fields $ \_ -> var Flexible
125+ cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
126+ let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
127+ recordType = record fields' (TermN EmptyRecord1)
128+ return . ex vars $ CAnd (tipe === recordType : cs)
136129
137130 Markdown _ ->
138131 return $ tipe === Env.get env Env.types "Element"
compiler/Type/Type.hs+1
@@ -25,6 +25,7 @@ data TermN a
2525 | TermN (Term1 (TermN a))
2626 deriving Show
2727
28+record :: Map.Map String [TermN a] -> TermN a -> TermN a
2829record fs rec = TermN (Record1 fs rec)
2930
3031type Type = TermN Variable