content: 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 ArbitraryRank      = text "ArbitraryRank"
    ppr (LimitedRank top_forall_ok r)
                           = text "LimitedRank" <+> ppr top_forall_ok
                                                <+> parens (ppr r)
    ppr MonoTypeRankZero   = text "MonoTypeRankZero"
    ppr MonoTypeTyConArg   = text "MonoTypeTyConArg"
    ppr MonoTypeSynArg     = text "MonoTypeSynArg"
    ppr MonoTypeConstraint = text "MonoTypeConstraint"
    ppr MustBeMonoType     = text "MustBeMonoType"
  