packages feed

ghc-9.14.1: GHC/Types/ThLevelIndex.hs

module GHC.Types.ThLevelIndex where

import GHC.Prelude
import GHC.Utils.Outputable
import GHC.Types.Basic ( ImportLevel(..) )
import Data.Data

-- | The integer which represents the level
newtype ThLevelIndex = ThLevelIndex Int deriving (Eq, Ord, Data)
    -- NB: see Note [Template Haskell levels] in GHC.Tc.Gen.Splice
    -- Incremented when going inside a bracket,
    -- decremented when going inside a splice

instance Outputable ThLevelIndex where
    ppr (ThLevelIndex i) = int i

incThLevelIndex :: ThLevelIndex -> ThLevelIndex
incThLevelIndex (ThLevelIndex i) = ThLevelIndex (i + 1)

decThLevelIndex :: ThLevelIndex -> ThLevelIndex
decThLevelIndex (ThLevelIndex i) = ThLevelIndex (i - 1)

topLevelIndex :: ThLevelIndex
topLevelIndex = ThLevelIndex 0

spliceLevelIndex :: ThLevelIndex
spliceLevelIndex = decThLevelIndex topLevelIndex

quoteLevelIndex :: ThLevelIndex
quoteLevelIndex = incThLevelIndex topLevelIndex

-- | Convert a 'GHC.Types.Basic.ImportLevel' to a 'ThLevelIndex'
thLevelIndexFromImportLevel :: ImportLevel -> ThLevelIndex
thLevelIndexFromImportLevel NormalLevel = topLevelIndex
thLevelIndexFromImportLevel SpliceLevel = spliceLevelIndex
thLevelIndexFromImportLevel QuoteLevel  = quoteLevelIndex