packages feed

uhc-light-1.1.9.3: src/UHC/Light/Compiler/Ty/AppSpineGam.hs

module UHC.Light.Compiler.Ty.AppSpineGam
( module UHC.Light.Compiler.Gam.AppSpineGam
, asGamLookup
, mkAppSpineGam
, asFOUpdCoe )
where
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Opts
import UHC.Light.Compiler.Ty
import UHC.Light.Compiler.Gam
import UHC.Light.Compiler.Gam.AppSpineGam
import UHC.Light.Compiler.Gam.AppSpineGam
import UHC.Light.Compiler.Ty.FitsInCommon
import UHC.Light.Compiler.Ty.FIEnv
import UHC.Util.Utils
import UHC.Light.Compiler.AbstractCore
import UHC.Light.Compiler.Core.Subst


{-# LINE 46 "src/ehc/Ty/AppSpineGam.chs" #-}
arrowAppSpineVertebraeInfoL :: FIEnv -> [AppSpineVertebraeInfo]
arrowAppSpineVertebraeInfoL env
  = [ AppSpineVertebraeInfo polContravariant fioMkStrong
          asFODflt
          (Just dfltFOUpdCoe)
    , AppSpineVertebraeInfo polCovariant id
          asFOArrow
          (Just (\opts [ffo,afo]
                  -> let (u',u1) = mkNewUID (foUniq afo)
                         -- c = lrcoeForLamTyApp opts u1 (foCSubst afo) (foLRCoe ffo) (foLRCoe afo)
                         (c,s) = lrcoeForLamTyAppAsSubst opts u1 (foLRCoe ffo) (foLRCoe afo)
                     in  afo { foUniq = u'
                             , foLRCoe = c
                             , foCSubst = foCSubst afo `cSubstApp` s
                             }
          )     )
    ]

prodAppSpineVertebraeInfoL :: [AppSpineVertebraeInfo]
prodAppSpineVertebraeInfoL
  = repeat
    $ AppSpineVertebraeInfo polCovariant id asFODflt
          (Just dfltFOUpdCoe)

{-# LINE 86 "src/ehc/Ty/AppSpineGam.chs" #-}
dfltFOUpdCoe :: AppSpineFOUpdCoe
dfltFOUpdCoe _ x = last' (panic "Ty.AppSpineGam.dfltFOUpdCoe") x

asFOUpdCoe :: AppSpineVertebraeInfo -> AppSpineFOUpdCoe
asFOUpdCoe = maybe dfltFOUpdCoe id . asMbFOUpdCoe

{-# LINE 94 "src/ehc/Ty/AppSpineGam.chs" #-}
asFODflt :: FIOut -> FIOut -> FIOut
asFODflt _ afo = afo

{-# LINE 99 "src/ehc/Ty/AppSpineGam.chs" #-}
asFOArrow :: FIOut -> FIOut -> FIOut
asFOArrow _ afo = afo {foLInstToL = InstTo_Plain : foLInstToL afo, foRInstToL = InstTo_Plain : foRInstToL afo}

{-# LINE 108 "src/ehc/Ty/AppSpineGam.chs" #-}
asGamLookup :: HsName -> AppSpineGam -> Maybe AppSpineInfo
asGamLookup nm g
  = case gamLookup nm g of
      j@(Just _)
        -> j
      Nothing | hsnIsProd nm
        -> Just $ emptyAppSpineInfo {asgiVertebraeL = take (hsnProdArity nm) prodAppSpineVertebraeInfoL}
      _ -> Nothing


{-# LINE 125 "src/ehc/Ty/AppSpineGam.chs" #-}
mkAppSpineGam ::  FIEnv -> AppSpineGam
mkAppSpineGam env
  = assocLToGam
      [ (hsnArrow       , emptyAppSpineInfo {asgiVertebraeL = arrowAppSpineVertebraeInfoL env})
      , (hsnRec         , emptyAppSpineInfo {asgiVertebraeL = take 1 prodAppSpineVertebraeInfoL})
      ]