module Top.Implementation.TypeGraphSubstitution where
import Top.Implementation.TypeGraph.ClassMonadic
import Top.Implementation.TypeGraph.Standard
import Top.Implementation.TypeGraph.Heuristic
import Top.Interface.Substitution
import Top.Interface.Basic
import Top.Interface.TypeInference
import Top.Interface.Qualification
import Top.Implementation.TypeGraph.DefaultHeuristics
import Top.Implementation.TypeGraph.ApplyHeuristics
import Top.Monad.Select
import Top.Monad.StateFix
import Top.Solver
import Top.Implementation.General
import Top.Util.Embedding
data TypeGraphState info = TypeGraphState
{ typegraph :: StandardTypeGraph info
, heuristics :: PathHeuristics info
}
instance Show info => SolveState (TypeGraphState info) where
stateName _ = "Typegraph substitution state"
instance Show info => Show (TypeGraphState info) where
show = show . typegraph
instance Show info => Empty (TypeGraphState info) where
empty = TypeGraphState empty defaultHeuristics
instance Embedded ClassSubst (TypeGraphState info) (TypeGraphState info) where embedding = idE
instance Embedded ClassSubst (Simple (TypeGraphState info) x m) (TypeGraphState info) where embedding = fromFstSimpleE embedding
instance ( Monad m
, Embedded ClassSubst (s (StateFixT s m)) t
, HasTG (Select t (StateFixT s m)) info
) =>
HasTG (StateFixT s m) info where
withTypeGraph f = deSubst (withTypeGraph f)
instance ( MonadState s m
, Embedded ClassSubst s (TypeGraphState info)
) =>
HasTG (Select (TypeGraphState info) m) info where
withTypeGraph f =
do (a, new) <- gets (f . typegraph)
modify (\tgs -> tgs { typegraph = new })
return a
instance ( HasBasic m info
, HasTI m info
, HasQual m info
, HasTG m info
, MonadWriter LogEntries m
, Show info
, MonadState s m
, Embedded ClassSubst s (TypeGraphState info)
) =>
HasSubst (Select (TypeGraphState info) m) info where
makeSubstConsistent =
do hs <- gets heuristics
select (removeInconsistencies hs)
unifyTerms a b c = select (theUnifyTerms a b c)
findSubstForVar a = select (substituteVariable a)
fixpointSubst = select makeFixpointSubst
removeInconsistencies :: HasTypeGraph m info => PathHeuristics info -> m ()
removeInconsistencies hs =
do errs <- applyHeuristics hs
mapM_ deleteEdge (concatMap fst errs)
mapM_ (addLabeledError unificationErrorLabel . snd) errs
if null errs
then
unmarkPossibleErrors
else
removeInconsistencies hs