module GHC.Types.ThLevelIndex where

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

-- | The integer which represents the level
newtype ThLevelIndex = ThLevelIndex Int deriving (ThLevelIndex -> ThLevelIndex -> Bool
(ThLevelIndex -> ThLevelIndex -> Bool)
-> (ThLevelIndex -> ThLevelIndex -> Bool) -> Eq ThLevelIndex
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThLevelIndex -> ThLevelIndex -> Bool
== :: ThLevelIndex -> ThLevelIndex -> Bool
$c/= :: ThLevelIndex -> ThLevelIndex -> Bool
/= :: ThLevelIndex -> ThLevelIndex -> Bool
Eq, Eq ThLevelIndex
Eq ThLevelIndex =>
(ThLevelIndex -> ThLevelIndex -> Ordering)
-> (ThLevelIndex -> ThLevelIndex -> Bool)
-> (ThLevelIndex -> ThLevelIndex -> Bool)
-> (ThLevelIndex -> ThLevelIndex -> Bool)
-> (ThLevelIndex -> ThLevelIndex -> Bool)
-> (ThLevelIndex -> ThLevelIndex -> ThLevelIndex)
-> (ThLevelIndex -> ThLevelIndex -> ThLevelIndex)
-> Ord ThLevelIndex
ThLevelIndex -> ThLevelIndex -> Bool
ThLevelIndex -> ThLevelIndex -> Ordering
ThLevelIndex -> ThLevelIndex -> ThLevelIndex
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ThLevelIndex -> ThLevelIndex -> Ordering
compare :: ThLevelIndex -> ThLevelIndex -> Ordering
$c< :: ThLevelIndex -> ThLevelIndex -> Bool
< :: ThLevelIndex -> ThLevelIndex -> Bool
$c<= :: ThLevelIndex -> ThLevelIndex -> Bool
<= :: ThLevelIndex -> ThLevelIndex -> Bool
$c> :: ThLevelIndex -> ThLevelIndex -> Bool
> :: ThLevelIndex -> ThLevelIndex -> Bool
$c>= :: ThLevelIndex -> ThLevelIndex -> Bool
>= :: ThLevelIndex -> ThLevelIndex -> Bool
$cmax :: ThLevelIndex -> ThLevelIndex -> ThLevelIndex
max :: ThLevelIndex -> ThLevelIndex -> ThLevelIndex
$cmin :: ThLevelIndex -> ThLevelIndex -> ThLevelIndex
min :: ThLevelIndex -> ThLevelIndex -> ThLevelIndex
Ord)
    -- 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 -> SDoc
ppr (ThLevelIndex Int
i) = Int -> SDoc
forall doc. IsLine doc => Int -> doc
int Int
i

incThLevelIndex :: ThLevelIndex -> ThLevelIndex
incThLevelIndex :: ThLevelIndex -> ThLevelIndex
incThLevelIndex (ThLevelIndex Int
i) = Int -> ThLevelIndex
ThLevelIndex (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

decThLevelIndex :: ThLevelIndex -> ThLevelIndex
decThLevelIndex :: ThLevelIndex -> ThLevelIndex
decThLevelIndex (ThLevelIndex Int
i) = Int -> ThLevelIndex
ThLevelIndex (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)

topLevelIndex :: ThLevelIndex
topLevelIndex :: ThLevelIndex
topLevelIndex = Int -> ThLevelIndex
ThLevelIndex Int
0

spliceLevelIndex :: ThLevelIndex
spliceLevelIndex :: ThLevelIndex
spliceLevelIndex = ThLevelIndex -> ThLevelIndex
decThLevelIndex ThLevelIndex
topLevelIndex

quoteLevelIndex :: ThLevelIndex
quoteLevelIndex :: ThLevelIndex
quoteLevelIndex = ThLevelIndex -> ThLevelIndex
incThLevelIndex ThLevelIndex
topLevelIndex

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