@@ -2,17 +2,17 @@ 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 Type.Pool as Pool
5+import qualified Type.State as TS
6import Control.Arrow (first,second)
6import Control.Arrow (first,second)
7import Control.Monad.State
7import Control.Monad.State
9−unify :: Variable -> Variable -> StateT (Pool.Pool, [String]) IO ()
9+unify :: Variable -> Variable -> StateT TS.SolverState IO ()
10unify variable1 variable2 = do
10unify variable1 variable2 = do
11 equivalent <- liftIO $ UF.equivalent variable1 variable2
11 equivalent <- liftIO $ UF.equivalent variable1 variable2
12 if equivalent then return ()
12 if equivalent then return ()
13 else actuallyUnify variable1 variable2
13 else actuallyUnify variable1 variable2
15−actuallyUnify :: Variable -> Variable -> StateT (Pool.Pool, [String]) IO ()
15+actuallyUnify :: Variable -> Variable -> StateT TS.SolverState IO ()
16actuallyUnify variable1 variable2 = do
16actuallyUnify variable1 variable2 = do
17 desc1 <- liftIO $ UF.descriptor variable1
17 desc1 <- liftIO $ UF.descriptor variable1
18 desc2 <- liftIO $ UF.descriptor variable2
18 desc2 <- liftIO $ UF.descriptor variable2
@@ -34,25 +34,22 @@ actuallyUnify variable1 variable2 = do
34 rank' :: Int
34 rank' :: Int
35 rank' = min (rank desc1) (rank desc2)
35 rank' = min (rank desc1) (rank desc2)
37− merge1 :: StateT (Pool.Pool, [String]) IO ()
37+ merge1 :: StateT TS.SolverState IO ()
38 merge1 = liftIO $ do
38 merge1 = liftIO $ do
39 UF.union variable2 variable1
39 UF.union variable2 variable1
40 UF.setDescriptor variable1 (desc1 { flex = flex', name = name', rank = rank', mark = undefined })
40 UF.setDescriptor variable1 (desc1 { flex = flex', name = name', rank = rank', mark = undefined })
42− merge2 :: StateT (Pool.Pool, [String]) IO ()
42+ merge2 :: StateT TS.SolverState IO ()
43 merge2 = liftIO $ do
43 merge2 = liftIO $ do
44 UF.union variable1 variable2
44 UF.union variable1 variable2
45 UF.setDescriptor variable2 (desc2 { flex = flex', name = name', rank = rank', mark = undefined })
45 UF.setDescriptor variable2 (desc2 { flex = flex', name = name', rank = rank', mark = undefined })
47− fresh :: Maybe (Term1 Variable) -> StateT (Pool.Pool, [String]) IO Variable
47+ fresh :: Maybe (Term1 Variable) -> StateT TS.SolverState IO Variable
48 fresh structure = do
48 fresh structure = do
49 var <- liftIO . UF.fresh $ Descriptor {
49 var <- liftIO . UF.fresh $ Descriptor {
50 structure = structure, rank = rank', flex = flex', name = name', mark = undefined
50 structure = structure, rank = rank', flex = flex', name = name', mark = undefined
52− Pool.register var
52+ TS.register var
54− mistake :: String -> StateT (Pool.Pool, [String]) IO ()
55− mistake err = modify $ second (err:)
57 case (structure desc1, structure desc2) of
54 case (structure desc1, structure desc2) of
58 (Nothing, _) | flex desc1 == Flexible -> merge2
55 (Nothing, _) | flex desc1 == Flexible -> merge2
@@ -61,8 +58,8 @@ actuallyUnify variable1 variable2 = do
61 (Just (Var1 v), _) -> unify v variable2
58 (Just (Var1 v), _) -> unify v variable2
62 (_, Just (Var1 v)) -> unify v variable1
59 (_, Just (Var1 v)) -> unify v variable1
64− (Nothing, _) -> mistake "Cannot unify rigid type variable."
61+ (Nothing, _) -> TS.addError "Cannot unify rigid type variable."
65− (_, Nothing) -> mistake "Cannot unify rigid type variable."
62+ (_, Nothing) -> TS.addError "Cannot unify rigid type variable."
67 (Just type1, Just type2) ->
64 (Just type1, Just type2) ->
68 case (type1,type2) of
65 case (type1,type2) of
@@ -79,6 +76,6 @@ actuallyUnify variable1 variable2 = do
81 (Record1 fields1 ext1, Record1 fields2 ext2) ->
78 (Record1 fields1 ext1, Record1 fields2 ext2) ->
82− mistake "did not write record unification yet"
79+ TS.addError "did not write record unification yet"
84− _ -> mistake "Could not unify types"
81+ _ -> TS.addError "Could not unify types"