@@ -12,12 +12,16 @@ import qualified Type.State as TS
12import Type.Type
12import Type.Type
13import Type.PrettyPrint
13import Type.PrettyPrint
14import Text.PrettyPrint (render)
14import Text.PrettyPrint (render)
15+import Elm.Utils ((|>))
16unify :: A.Region -> Variable -> Variable -> StateT TS.SolverState IO ()
18unify :: A.Region -> Variable -> Variable -> StateT TS.SolverState IO ()
17unify region variable1 variable2 = do
19unify region variable1 variable2 = do
18 equivalent <- liftIO $ UF.equivalent variable1 variable2
20 equivalent <- liftIO $ UF.equivalent variable1 variable2
19− if equivalent then return ()
21+ if equivalent
20− else actuallyUnify region variable1 variable2
23+ else actuallyUnify region variable1 variable2
22actuallyUnify :: A.Region -> Variable -> Variable -> StateT TS.SolverState IO ()
26actuallyUnify :: A.Region -> Variable -> Variable -> StateT TS.SolverState IO ()
23actuallyUnify region variable1 variable2 = do
27actuallyUnify region variable1 variable2 = do
@@ -171,26 +175,38 @@ actuallyUnify region variable1 variable2 = do
171 (EmptyRecord1, Record1 fields ext) | Map.null fields -> unify' ext variable1
175 (EmptyRecord1, Record1 fields ext) | Map.null fields -> unify' ext variable1
173 (Record1 fields1 ext1, Record1 fields2 ext2) ->
177 (Record1 fields1 ext1, Record1 fields2 ext2) ->
174− do sequence . concat . Map.elems $ Map.intersectionWith (zipWith unify') fields1 fields2
178+ do Map.intersectionWith (zipWith unify') fields1 fields2
183+ let mkRecord fs ext =
175− let mkRecord fs ext = fresh . Just $ Record1 fs ext
184+ fresh (Just (Record1 fs ext))
176− case (Map.null fields1', Map.null fields2') of
186+ case (Map.null fields1', Map.null fields2') of
177− (True , True ) -> unify' ext1 ext2
188+ unify' ext1 ext2
178− (True , False) -> do
190+ (True, False) ->
179− record2' <- mkRecord fields2' ext2
191+ do record2' <- mkRecord fields2' ext2
180− unify' ext1 record2'
192+ unify' ext1 record2'
181− (False, True ) -> do
194+ (False, True) ->
182− record1' <- mkRecord fields1' ext1
195+ do record1' <- mkRecord fields1' ext1
183− unify' record1' ext2
196+ unify' record1' ext2
184− (False, False) -> do
198+ (False, False) ->
185− record1' <- mkRecord fields1' =<< fresh Nothing
199+ do record1' <- mkRecord fields1' =<< fresh Nothing
186− record2' <- mkRecord fields2' =<< fresh Nothing
200+ record2' <- mkRecord fields2' =<< fresh Nothing
187− unify' record1' ext2
201+ unify' record1' ext2
188− unify' ext1 record2'
202+ unify' ext1 record2'
190 fields1' = unmerged fields1 fields2
204 fields1' = unmerged fields1 fields2
191 fields2' = unmerged fields2 fields1
205 fields2' = unmerged fields2 fields1
208+ Map.union (Map.intersectionWith eat a b) a
193− unmerged a b = Map.filter (not . null) $ Map.union (Map.intersectionWith eat a b) a
209+ |> Map.filter (not . null)
195 eat (_:xs) (_:ys) = eat xs ys
211 eat (_:xs) (_:ys) = eat xs ys
196 eat xs _ = xs
212 eat xs _ = xs