content: {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE TemplateHaskell #-}
  {-# OPTIONS_GHC -Wall #-}
  {-# OPTIONS_HADDOCK show-extensions #-}
  -----------------------------------------------------------------------------
  -- |
  -- Module      :  ToySolver.Version.TH
  -- Copyright   :  (c) Masahiro Sakai 2015
  -- License     :  BSD-style
  --
  -- Maintainer  :  masahiro.sakai@gmail.com
  -- Stability   :  provisional
  -- Portability :  non-portable
  --
  -----------------------------------------------------------------------------
  module ToySolver.Version.TH
    ( gitHashQ
    , compilationTimeQ
    ) where
  
  import Control.Exception
  import Control.Monad
  import Data.Time
  import System.Process
  import Language.Haskell.TH
  
  getGitHash :: IO (Maybe String)
  getGitHash =
    liftM (Just . takeWhile (/='\n')) (readProcess "git" ["rev-parse", "--short", "HEAD"] "")
    `catch` \(_::SomeException) -> return Nothing
  
  gitHashQ :: ExpQ
  gitHashQ = do
    m <- runIO getGitHash
    case m of
      Nothing -> [| Nothing |]
      Just s -> [| Just |] `appE` litE (stringL s)
  
  compilationTimeQ :: ExpQ
  compilationTimeQ = do
    tm <- runIO getCurrentTime
    [| read $(litE (stringL (show tm))) :: UTCTime |]
  