{-# LANGUAGE CPP #-}
module Info (
  versionInfo
, info
#ifdef TEST
, formatInfo
#endif
) where

import           Imports

import           Data.List
import           System.Process
import           System.IO.Unsafe

#if __GLASGOW_HASKELL__ < 900
import           Config as GHC
#else
import           GHC.Settings.Config as GHC
#endif

import           Data.Version (showVersion)
import qualified Paths_doctest

import           Interpreter (ghc)

version :: String
version :: String
version = Version -> String
showVersion Version
Paths_doctest.version

ghcVersion :: String
ghcVersion :: String
ghcVersion = String
GHC.cProjectVersion

versionInfo :: String
versionInfo :: String
versionInfo = [String] -> String
unlines [
    String
"doctest version " forall a. [a] -> [a] -> [a]
++ String
version
  , String
"using version " forall a. [a] -> [a] -> [a]
++ String
ghcVersion forall a. [a] -> [a] -> [a]
++ String
" of the GHC API"
  , String
"using " forall a. [a] -> [a] -> [a]
++ String
ghc
  ]

info :: String
info :: String
info = Info -> String
formatInfo forall a b. (a -> b) -> a -> b
$
    (String
"version", String
version)
  forall a. a -> [a] -> [a]
: (String
"ghc_version", String
ghcVersion)
  forall a. a -> [a] -> [a]
: (String
"ghc", String
ghc)
  forall a. a -> [a] -> [a]
: Info
ghcInfo

type Info = [(String, String)]

ghcInfo :: Info
ghcInfo :: Info
ghcInfo = forall a. Read a => String -> a
read forall a b. (a -> b) -> a -> b
$ forall a. IO a -> a
unsafePerformIO (String -> [String] -> String -> IO String
readProcess String
ghc [String
"--info"] String
"")

formatInfo :: Info -> String
formatInfo :: Info -> String
formatInfo Info
xs = String
" [" forall a. [a] -> [a] -> [a]
++ (forall a. [a] -> [[a]] -> [a]
intercalate String
"\n ," forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> String
show Info
xs) forall a. [a] -> [a] -> [a]
++ String
"\n ]\n"