2012-05-11 10:28:56 +00:00
|
|
|
|
2012-08-09 14:38:18 +00:00
|
|
|
module Types.Unify (unify) where
|
2012-05-11 10:28:56 +00:00
|
|
|
|
2012-05-18 03:16:16 +00:00
|
|
|
import Control.Monad (liftM)
|
2012-08-09 14:38:18 +00:00
|
|
|
import qualified Data.Map as Map
|
2012-11-29 06:16:08 +00:00
|
|
|
|
2013-06-14 05:45:08 +00:00
|
|
|
import SourceSyntax.Module
|
|
|
|
import Unique
|
2013-05-28 13:47:36 +00:00
|
|
|
import qualified Types.Constrain as Constrain
|
|
|
|
import qualified Types.Solver as Solver
|
|
|
|
import qualified Types.Alias as Alias
|
2012-05-20 05:09:12 +00:00
|
|
|
|
2013-06-09 18:15:03 +00:00
|
|
|
import qualified Types.Substitutions as Subst
|
|
|
|
import System.IO.Unsafe
|
|
|
|
import Control.Arrow (second)
|
|
|
|
|
2013-04-05 16:55:30 +00:00
|
|
|
unify hints modul@(Module _ _ _ stmts) = run $ do
|
2013-06-09 18:15:03 +00:00
|
|
|
result <- Constrain.constrain hints modul
|
|
|
|
case result of
|
|
|
|
Left err -> return (Left err)
|
|
|
|
Right (schemes, constraints) ->
|
2013-06-30 20:43:00 +00:00
|
|
|
do subs <- {- unsafePerformIO (mapM print constraints) `seq` -}
|
2013-06-14 01:35:37 +00:00
|
|
|
Solver.solver (Alias.get stmts) Map.empty constraints
|
2013-06-09 18:15:03 +00:00
|
|
|
let ss = either (const []) Map.toList subs
|
2013-06-14 01:35:37 +00:00
|
|
|
-- unsafePerformIO (mapM print . map (second (Subst.subst ss)) $ concatMap Map.toList schemes) `seq`
|
|
|
|
return subs
|
2012-05-11 10:28:56 +00:00
|
|
|
|