module CabalGild.Unstable.Type.Extension where

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

-- | This type exists to provide a different 'Ord' instance for
-- 'Extension.Extension'. The instance provided by @Cabal-syntax@ sorts things
-- in a surprising order. This one sorts things alphabetically.
newtype Extension = Extension
  { Extension -> Extension
unwrap :: Extension.Extension
  }
  deriving (Extension -> Extension -> Bool
(Extension -> Extension -> Bool)
-> (Extension -> Extension -> Bool) -> Eq Extension
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Extension -> Extension -> Bool
== :: Extension -> Extension -> Bool
$c/= :: Extension -> Extension -> Bool
/= :: Extension -> Extension -> Bool
Eq, Int -> Extension -> ShowS
[Extension] -> ShowS
Extension -> String
(Int -> Extension -> ShowS)
-> (Extension -> String)
-> ([Extension] -> ShowS)
-> Show Extension
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Extension -> ShowS
showsPrec :: Int -> Extension -> ShowS
$cshow :: Extension -> String
show :: Extension -> String
$cshowList :: [Extension] -> ShowS
showList :: [Extension] -> ShowS
Show)

instance Ord Extension where
  compare :: Extension -> Extension -> Ordering
compare = (Extension -> String) -> Extension -> Extension -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
Ord.comparing Extension -> String
forall a. Pretty a => a -> String
Pretty.prettyShow

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

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