{-# OPTIONS_GHC -Wno-orphans #-}
module GHC.Hs.Specificity where

import Prelude
import Control.DeepSeq (NFData(..))

import GHC.Utils.Outputable
import GHC.Utils.Binary

import Language.Haskell.Syntax.Specificity

{- *********************************************************************
*                                                                      *
*                   ForAllTyFlag
*                                                                      *
********************************************************************* -}

instance Outputable ForAllTyFlag where
  ppr Required  = text "[req]"
  ppr Specified = text "[spec]"
  ppr Inferred  = text "[infrd]"

instance Binary Specificity where
  put_ bh SpecifiedSpec = putByte bh 0
  put_ bh InferredSpec  = putByte bh 1

  get bh = do
    h <- getByte bh
    case h of
      0 -> return SpecifiedSpec
      _ -> return InferredSpec

instance Binary ForAllTyFlag where
  put_ bh Required  = putByte bh 0
  put_ bh Specified = putByte bh 1
  put_ bh Inferred  = putByte bh 2

  get bh = do
    h <- getByte bh
    case h of
      0 -> return Required
      1 -> return Specified
      _ -> return Inferred

instance NFData Specificity where
  rnf SpecifiedSpec = ()
  rnf InferredSpec = ()
instance NFData ForAllTyFlag where
  rnf (Invisible spec) = rnf spec
  rnf Required = ()


