module Control.Supermonad.Plugin.Environment.Lift
(
produceEvidenceForCt
, produceEvidenceFor
, isPotentiallyInstantiatedCt
, isBindConstraint, isReturnConstraint
, partiallyApplyTyCons ) where
import TcRnTypes ( Ct )
import TcEvidence ( EvTerm )
import Outputable ( SDoc )
import Type ( Type, TyVar )
import TyCon ( TyCon )
import InstEnv ( ClsInst )
import Control.Supermonad.Plugin.Environment
( SupermonadPluginM
, runTcPlugin
, getBindClass, getReturnClass
, getGivenConstraints
)
import qualified Control.Supermonad.Plugin.Utils as U
import qualified Control.Supermonad.Plugin.Evidence as E
import Control.Supermonad.Plugin.Constraint ( isClassConstraint )
produceEvidenceForCt :: Ct -> SupermonadPluginM (Either SDoc EvTerm)
produceEvidenceForCt ct = do
givenCts <- getGivenConstraints
runTcPlugin $ E.produceEvidenceForCt givenCts ct
produceEvidenceFor :: ClsInst -> [Type] -> SupermonadPluginM (Either SDoc EvTerm)
produceEvidenceFor inst instArgs = do
givenCts <- getGivenConstraints
runTcPlugin $ E.produceEvidenceFor givenCts inst instArgs
isPotentiallyInstantiatedCt :: Ct -> [(TyVar, Either TyCon TyVar)] -> SupermonadPluginM Bool
isPotentiallyInstantiatedCt ct assoc = do
givenCts <- getGivenConstraints
runTcPlugin $ E.isPotentiallyInstantiatedCt givenCts ct assoc
isBindConstraint :: Ct -> SupermonadPluginM Bool
isBindConstraint ct = do
bindCls <- getBindClass
return $ isClassConstraint bindCls ct
isReturnConstraint :: Ct -> SupermonadPluginM Bool
isReturnConstraint ct = do
returnCls <- getReturnClass
return $ isClassConstraint returnCls ct
partiallyApplyTyCons :: [(TyVar, Either TyCon TyVar)] -> SupermonadPluginM (Either SDoc [(TyVar, Type, [TyVar])])
partiallyApplyTyCons = runTcPlugin . U.partiallyApplyTyCons