content: -- | Functions that work with 'Extension's in .cabal file and in
  -- separate.
  
  module Importify.Cabal.Extension
         ( buildInfoExtensions
         , withHarmlessExtensions
         ) where
  
  import           Universum
  
  import qualified Distribution.ModuleName         as Cabal
  import           Distribution.PackageDescription (BuildInfo (..))
  import qualified Language.Haskell.Extension      as Cabal (Extension (..))
  import           Language.Haskell.Exts.Extension (Extension (..), KnownExtension (..))
  
  
  -- | Get list of all extensions from 'BuildInfo' and convert them into
  -- 'HSE.Extension'.
  buildInfoExtensions :: BuildInfo -> [Extension]
  buildInfoExtensions BuildInfo{..} = mapMaybe cabalExtToHseExt
                                    $ defaultExtensions ++ otherExtensions
  
  cabalExtToHseExt :: Cabal.Extension -> Maybe Extension
  cabalExtToHseExt = readMaybe . show
  
  {-
  showExt :: Cabal.Extension -> String
  showExt (Cabal.EnableExtension ext)   = show ext
  showExt (Cabal.DisableExtension ext)  = "No" ++ show ext
  showExt (Cabal.UnknownExtension name) = name
  -}
  
  -- | This function add list of harmless extensions wich helps to avoid
  -- some parsing errors but doesn't affect already correct parsing
  -- results.
  withHarmlessExtensions :: [Extension] -> [Extension]
  withHarmlessExtensions = ordNub
                         . (++ map EnableExtension [ MultiParamTypeClasses
                                                   , FlexibleContexts
                                                   , ConstraintKinds
                                                   , ExplicitNamespaces
                                                   ])
  