module CabalGild.Type.Language where

import qualified Distribution.Parsec as Parsec
import qualified Distribution.Pretty as Pretty
import qualified Language.Haskell.Extension as Extension

-- | This type exists to provide an 'Ord' instance for
-- 'Language.Language', which was added in @Cabal-syntax-3.10.1.0@.
newtype Language = Language
  { Language -> Language
unwrap :: Extension.Language
  }
  deriving (Language -> Language -> Bool
(Language -> Language -> Bool)
-> (Language -> Language -> Bool) -> Eq Language
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Language -> Language -> Bool
== :: Language -> Language -> Bool
$c/= :: Language -> Language -> Bool
/= :: Language -> Language -> Bool
Eq, Int -> Language -> ShowS
[Language] -> ShowS
Language -> String
(Int -> Language -> ShowS)
-> (Language -> String) -> ([Language] -> ShowS) -> Show Language
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Language -> ShowS
showsPrec :: Int -> Language -> ShowS
$cshow :: Language -> String
show :: Language -> String
$cshowList :: [Language] -> ShowS
showList :: [Language] -> ShowS
Show)

instance Ord Language where
  compare :: Language -> Language -> Ordering
compare Language
x Language
y = case (Language -> Language
unwrap Language
x, Language -> Language
unwrap Language
y) of
    (Language
Extension.Haskell98, Language
Extension.Haskell98) -> Ordering
EQ
    (Language
Extension.Haskell98, Language
_) -> Ordering
LT
    (Language
Extension.Haskell2010, Language
Extension.Haskell2010) -> Ordering
EQ
    (Language
Extension.Haskell2010, Language
Extension.Haskell98) -> Ordering
GT
    (Language
Extension.Haskell2010, Language
_) -> Ordering
LT
    (Language
Extension.GHC2021, Language
Extension.GHC2021) -> Ordering
EQ
    (Language
Extension.GHC2021, Extension.UnknownLanguage String
_) -> Ordering
LT
    (Language
Extension.GHC2021, Language
_) -> Ordering
GT
    (Extension.UnknownLanguage String
s, Extension.UnknownLanguage String
t) -> String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare String
s String
t
    (Extension.UnknownLanguage String
_, Language
_) -> Ordering
GT

instance Parsec.Parsec Language where
  parsec :: forall (m :: * -> *). CabalParsing m => m Language
parsec = Language -> Language
Language (Language -> Language) -> m Language -> m Language
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Language
forall a (m :: * -> *). (Parsec a, CabalParsing m) => m a
forall (m :: * -> *). CabalParsing m => m Language
Parsec.parsec

instance Pretty.Pretty Language where
  pretty :: Language -> Doc
pretty = Language -> Doc
forall a. Pretty a => a -> Doc
Pretty.pretty (Language -> Doc) -> (Language -> Language) -> Language -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Language -> Language
unwrap