packages feed

uhc-light-1.1.9.2: src/UHC/Light/Compiler/Ty/FitsInCommon2.hs

module UHC.Light.Compiler.Ty.FitsInCommon2
( module UHC.Light.Compiler.Ty.FIEnv
, ppTyWithFI, ppTyWithFIFO
, FIIn' (..), FIIn
, emptyFI', emptyFI
, fiLookupVar', fiLookupTyVarCyc
, fiLookupReplaceTyCyc
, fiAllowTyVarBind
, fiInitInstRank, fiRankEqInstRank, fiUpdRankByPolarity
, fiPlusVarMp, fiSetVarMp, fiBindTyVar
, TyBetaRedEnv (..), emptyTyBetaRedEnv, emptyTyBetaRedEnv'
, fiBindImplsVar )
where
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Ty.FitsInCommon
import UHC.Light.Compiler.Ty
import UHC.Light.Compiler.Ty.Utils1
import UHC.Light.Compiler.Substitutable
import UHC.Light.Compiler.Opts
import UHC.Light.Compiler.VarMp
import UHC.Light.Compiler.Ty.FIEnv
import qualified Data.Set as Set
import UHC.Util.Pretty
import UHC.Light.Compiler.AbstractCore
import UHC.Util.Utils



{-# LINE 39 "src/ehc/Ty/FitsInCommon2.chs" #-}
ppTyWithFI :: (VarLookupCmb VarMp gm, VarUpdatable Ty gm, SubstVarKey gm ~ VarId) => FIIn' gm -> Ty -> PP_Doc
ppTyWithFI fi t =  ppTyS (fiVarMpLoc fi |+> fiVarMp fi) t

ppTyWithFIFO :: (VarLookupCmb VarMp gm, VarUpdatable Ty gm, SubstVarKey gm ~ VarId) => FIIn' gm -> FIOut -> Ty -> PP_Doc
ppTyWithFIFO fi fo t    =  ppTyS (foVarMp fo |+> fiVarMp fi) t

{-# LINE 59 "src/ehc/Ty/FitsInCommon2.chs" #-}
data FIIn' globvm
  = FIIn
      { fiFIOpts          ::  !FIOpts               -- options to fitsIn
      , fiUniq            ::  !UID                  -- unique thread
      , fiVarMp           ::   globvm               -- global (type) var bindings
      , fiVarMpLoc        ::  !VarMp                    -- locally introduced (type) var bindings
      , fiExpLTvS         ::  !(Set.Set TyVarId)        -- lhs ty vars for which expansion (via VarMp) is inhibited (already done once)
      , fiExpRTvS         ::  !(Set.Set TyVarId)        -- and rhs
      , fiRank            ::  !Int                  -- rank
      , fiMbInstRank      ::  !(Maybe Int)          -- rank where possible deep instantation did start
      , fiTrace           ::  [PP_Doc]              -- ???? 20080110, must be strict otherwise ghc 6.8.1 generates crashing program ????
      , fiCoeCtx		  ::  CoeCtx				-- the coercion context
      , fiEnv             ::  !FIEnv                -- environment (Gam's,...)
      }
      deriving (Typeable)

type FIIn = FIIn' VarMp

{-# LINE 83 "src/ehc/Ty/FitsInCommon2.chs" #-}
emptyFI' :: gm -> FIIn' gm
emptyFI' m
  = FIIn
      { fiFIOpts          =   strongFIOpts
      , fiUniq            =   uidStart
      , fiVarMp           =   m
      , fiVarMpLoc        =   emptyVarMp
      , fiExpLTvS         =   Set.empty
      , fiExpRTvS         =   Set.empty
      , fiRank            =   1
      , fiMbInstRank      =   Nothing
      , fiTrace           =   []
      , fiCoeCtx		  =   CoeCtx_Allow
      , fiEnv             =   emptyFE
      }

-- emptyFI :: forall gm . FIIn' gm
emptyFI = emptyFI' emptyVarMp

{-# LINE 106 "src/ehc/Ty/FitsInCommon2.chs" #-}
-- lookup a tvar subsequently in 2 VarMps
fiLookupVar' :: (v -> m1 -> Maybe x) -> (v -> m2 -> Maybe x) -> v -> m1 -> m2 -> Maybe x
fiLookupVar' lkup1 lkup2 v m1 m2
  = case lkup1 v m1 of
      Nothing -> lkup2 v m2
      j       -> j

-- lookup a tvar in the VarMps of a FIIn
fiLookupTyVarCyc :: VarLookup gm TyVarId VarMpInfo => FIIn' gm -> TyVarId -> Maybe Ty
fiLookupTyVarCyc  fi v  =  fiLookupVar' varmpTyLookupCyc varmpTyLookupCyc v (fiVarMpLoc fi) (fiVarMp fi)

{-# LINE 123 "src/ehc/Ty/FitsInCommon2.chs" #-}
-- lookup a possible tvar in the VarMps of a FIIn, the result being the replacement if any
fiLookupReplaceTyCyc :: VarLookup gm TyVarId VarMpInfo => FIIn' gm -> Ty -> Ty
fiLookupReplaceTyCyc  fi t  =  maybe t (maybe t id . fiLookupTyVarCyc fi) $ tyMbVar t

{-# LINE 137 "src/ehc/Ty/FitsInCommon2.chs" #-}
data TyBetaRedEnv gm
  = TyBetaRedEnv
      { tbredFI		:: FIIn' gm
      }

emptyTyBetaRedEnv' fe = TyBetaRedEnv ((emptyFI {fiEnv = fe}) :: FIIn)
emptyTyBetaRedEnv = TyBetaRedEnv emptyFI

{-# LINE 151 "src/ehc/Ty/FitsInCommon2.chs" #-}
-- Pre: is a tyvar
fiAllowTyVarBind :: FIIn' gm -> Ty -> Bool
fiAllowTyVarBind fi (Ty_Var v f)   =  f `elem` fioBindCategs (fiFIOpts fi) -- f == TyVarCateg_Plain
                                      && not (v `Set.member` fioDontBind (fiFIOpts fi))
fiAllowTyVarBind fi _              =  False

{-# LINE 165 "src/ehc/Ty/FitsInCommon2.chs" #-}
fiInitInstRank :: FIIn' gm -> FIIn' gm
fiInitInstRank fi = maybe (fi {fiMbInstRank = Just (fiRank fi)}) (const fi) (fiMbInstRank fi)

fiRankEqInstRank :: FIIn' gm -> Bool
fiRankEqInstRank fi = maybe True (== fiRank fi) (fiMbInstRank fi)

fiUpdRankByPolarity :: Polarity -> FIIn' gm -> FIIn' gm
fiUpdRankByPolarity pol fi = if polIsContravariant pol then fi {fiRank = fiRank fi + 1} else fi

{-# LINE 180 "src/ehc/Ty/FitsInCommon2.chs" #-}
fiPlusVarMp :: VarMp -> FIIn' gm -> FIIn' gm
fiPlusVarMp c fi = fi {fiVarMpLoc = c |+> fiVarMpLoc fi}

fiSetVarMp :: VarMp -> FIIn' gm -> FIIn' gm
fiSetVarMp  c fi = fi {fiVarMpLoc = c}

fiBindTyVar :: TyVarId -> Ty -> FIIn' gm -> FIIn' gm
fiBindTyVar v t = fiPlusVarMp (v `varmpTyUnit` t)

{-# LINE 191 "src/ehc/Ty/FitsInCommon2.chs" #-}
fiBindImplsVar :: ImplsVarId -> Impls -> FIIn' gm -> FIIn' gm
fiBindImplsVar v i = fiPlusVarMp (v `varmpImplsUnit` i)