module GHC.Tc.Types.Rank (Rank(..))  where

import GHC.Base (Bool)
import GHC.Utils.Outputable (Outputable, (<+>), parens, ppr, text)

{-
Note [Higher rank types]
~~~~~~~~~~~~~~~~~~~~~~~~
Technically
            Int -> forall a. a->a
is still a rank-1 type, but it's not Haskell 98 (#5957).  So the
validity checker allow a forall after an arrow only if we allow it
before -- that is, with Rank2Types or RankNTypes
-}

data Rank = ArbitraryRank -- Any rank ok

          | LimitedRank   -- Note [Higher rank types]
                 Bool     -- Forall ok at top
                 Rank     -- Use for function arguments

          -- Monotypes that could be a polytype through an extension
          | MonoTypeRankZero   -- RankNTypes
          | MonoTypeTyConArg   -- ImpredicativeTypes
          | MonoTypeSynArg     -- LiberalTypeSynonyms
          | MonoTypeConstraint -- QuantifiedConstraints
          --

          | MustBeMonoType  -- Monotype regardless of flags

instance Outputable Rank where
  ppr :: Rank -> SDoc
ppr Rank
ArbitraryRank      = forall doc. IsLine doc => String -> doc
text String
"ArbitraryRank"
  ppr (LimitedRank Bool
top_forall_ok Rank
r)
                         = forall doc. IsLine doc => String -> doc
text String
"LimitedRank" forall doc. IsLine doc => doc -> doc -> doc
<+> forall a. Outputable a => a -> SDoc
ppr Bool
top_forall_ok
                                              forall doc. IsLine doc => doc -> doc -> doc
<+> forall doc. IsLine doc => doc -> doc
parens (forall a. Outputable a => a -> SDoc
ppr Rank
r)
  ppr Rank
MonoTypeRankZero   = forall doc. IsLine doc => String -> doc
text String
"MonoTypeRankZero"
  ppr Rank
MonoTypeTyConArg   = forall doc. IsLine doc => String -> doc
text String
"MonoTypeTyConArg"
  ppr Rank
MonoTypeSynArg     = forall doc. IsLine doc => String -> doc
text String
"MonoTypeSynArg"
  ppr Rank
MonoTypeConstraint = forall doc. IsLine doc => String -> doc
text String
"MonoTypeConstraint"
  ppr Rank
MustBeMonoType     = forall doc. IsLine doc => String -> doc
text String
"MustBeMonoType"