@@ -2,6 +2,7 @@ module Type.Unify (unify) where
3import Type.Type
3import Type.Type
4import qualified Data.UnionFind.IO as UF
4import qualified Data.UnionFind.IO as UF
5+import qualified Data.Map as Map
5import qualified Type.State as TS
6import qualified Type.State as TS
6import Control.Arrow (first,second)
7import Control.Arrow (first,second)
7import Control.Monad.State
8import Control.Monad.State
@@ -121,8 +122,23 @@ actuallyUnify variable1 variable2 = do
121 (EmptyRecord1, EmptyRecord1) ->
122 (EmptyRecord1, EmptyRecord1) ->
122 return ()
123 return ()
125+ (Record1 fields ext, EmptyRecord1) | Map.null fields -> unify ext variable2
126+ (EmptyRecord1, Record1 fields ext) | Map.null fields -> unify ext variable1
124 (Record1 fields1 ext1, Record1 fields2 ext2) ->
128 (Record1 fields1 ext1, Record1 fields2 ext2) ->
125− TS.addError "did not write record unification yet" variable1 variable2
129+ do sequence . concat . Map.elems $ Map.intersectionWith (zipWith unify) fields1 fields2
130+ record1' <- liftIO $ (structuredVar . Record1 fields1') =<< var Flexible
131+ record2' <- liftIO $ (structuredVar . Record1 fields2') =<< var Flexible
135+ fields1' = unmerged fields1 fields2
136+ fields2' = unmerged fields2 fields1
138+ unmerged a b = Map.filter (not . null) $ Map.unionWith eat a b
140+ eat (x:xs) (y:ys) = eat xs ys
127− _ -> TS.addError "could not unify types" variable1 variable2
143+ _ -> TS.addError "The following types are not equal" variable1 variable2