-- ** Monad
SIMCT(..), runSIMCT,
-- *** And its context
- SIMCtx(..), emptySIMCtx, allFreeSIMCtx,
+ SIMCtx(..), emptySIMCtx, allFreeSIMCtx, ctxFromBindings,
-- ** Internal helper functions
e2x, q2y, aliasN, aliasV, aliasX, aliasY, kUpUniq,
)where
import Control.Applicative (Applicative)
+import Control.Arrow (second)
import Control.Exception(assert)
import Control.Lens
import Control.Monad
allFreeSIMCtx fs = SIMCtx 0 IM.empty
$ M.fromList $ map (\x -> (x, VRStruct IFree)) fs
+ctxFromBindings :: [(DVar, NIX f)] -> SIMCtx f
+ctxFromBindings = SIMCtx 0 IM.empty . M.fromList . map (second VRName)
+
runSIMCT :: SIMCT m f a -> SIMCtx f -> m (Either UnifFail (a, SIMCtx f))
runSIMCT q x = runEitherT (runStateT (unSIMCT q) x)
where
alias_unifyUnaliasedNV n1 n2 =
fmap fst $ runIdentity
- $ flip CA.runSIMCT (CA.allFreeSIMCtx [v])
+ $ flip CA.runSIMCT (CA.ctxFromBindings [(v,n1)])
$ flip runReaderT (UnifParams True False)
$ do
- _ <- FA.unifyUnaliasedNV n1 v
_ <- FA.unifyUnaliasedNV n2 v
FA.expandV v
where v = "A"
where
alias_unify n1 n2 =
fmap fst $ runIdentity
- $ flip CA.runSIMCT (CA.allFreeSIMCtx [vA,vB])
+ $ flip CA.runSIMCT (CA.ctxFromBindings [(vA,n1),(vB,n2)])
$ flip runReaderT (UnifParams True False)
$ do
- _ <- FA.unifyUnaliasedNV n1 vA
- _ <- FA.unifyUnaliasedNV n2 vB
_ <- FA.unifyVV vA vB
FA.expandV vA
where vA = "A"
alias_unifyVF n1 n2 =
fmap fst $ runIdentity
- $ flip CA.runSIMCT (CA.allFreeSIMCtx [vA,vB])
+ $ flip CA.runSIMCT (CA.ctxFromBindings [(vA,n1),(vB,n2)])
$ do
- _ <- flip runReaderT (UnifParams True False) $ do
- _ <- FA.unifyUnaliasedNV n1 vA
- FA.unifyUnaliasedNV n2 vB
_ <- FA.unifyVF True (const $ return True) vA G [vB]
FA.expandV vA
where