{-# LANGUAGE CPP #-}

module HDocs.Ghc.Compat (
        pkgDatabase, cleanupHandler, UnitId, unitId, moduleUnitId, getPackageDetails
        ) where

import qualified GHC
import qualified Module
import qualified Packages as GHC

#if __GLASGOW_HASKELL__ == 710
import Exception (ExceptionMonad)
#endif

pkgDatabase :: GHC.DynFlags -> Maybe [GHC.PackageConfig]
#if __GLASGOW_HASKELL__ >= 800
pkgDatabase = fmap (concatMap snd) . GHC.pkgDatabase
#elif __GLASGOW_HASKELL__ == 710
pkgDatabase = GHC.pkgDatabase
#endif

#if __GLASGOW_HASKELL__ >= 800
cleanupHandler :: GHC.DynFlags -> m a -> m a
cleanupHandler _ = id
#elif __GLASGOW_HASKELL__ == 710
cleanupHandler :: (ExceptionMonad m) => GHC.DynFlags -> m a -> m a
cleanupHandler = GHC.defaultCleanupHandler
#endif

#if __GLASGOW_HASKELL__ >= 800
type UnitId = Module.UnitId
#elif __GLASGOW_HASKELL__ == 710
type UnitId = Module.PackageKey
#endif

unitId :: GHC.PackageConfig -> UnitId
#if __GLASGOW_HASKELL__ >= 802
unitId = GHC.packageConfigId
#elif __GLASGOW_HASKELL__ == 800
unitId = GHC.unitId
#elif __GLASGOW_HASKELL__ == 710
unitId = GHC.packageKey
#endif

moduleUnitId :: Module.Module -> UnitId
#if __GLASGOW_HASKELL__ >= 800
moduleUnitId = Module.moduleUnitId
#elif __GLASGOW_HASKELL__ == 710
moduleUnitId = Module.modulePackageKey
#endif

getPackageDetails :: GHC.DynFlags -> UnitId -> GHC.PackageConfig
getPackageDetails = GHC.getPackageDetails