-- 
-- (c) Susumu Katayama
--
module MagicHaskeller.GetTime where
import System.CPUTime
import System.Time -- better than Time in Haskell98 Library in that the former supports pretty printing TimeDiff.
import System.IO
import Control.Monad(liftM2)

batchWrite :: FilePath -> [IO a] -> IO ()
batchWrite filename ios = do is <- batchRun ios
                             hPutStrLn stderr (showCPUTime (sum is) ++ " seconds in total.")
                             writeFile filename $ unlines $ map showCPUTime is 
batchRun :: [IO a] -> IO [Integer]
batchRun []       = return []
batchRun (io:ios) = liftM2 (:) (fmap snd $ time io) (batchRun ios)

time :: IO a -> IO (a, Integer)
time act = do beginCT <- getClockTime
              begin <- getCPUTime
              result <- act
              end <- getCPUTime
              endCT <- getClockTime
              hPutStrLn stderr (showZero (timeDiffToString (diffClockTimes endCT beginCT)) ++ " in real,")
--          hPutStrLn stderr (shows (end-begin) " plusminus " ++ shows cpuTimePrecision " picoseconds spent.")
              hPutStrLn stderr (showCPUTime (end-begin) ++ " seconds in CPU time spent.")
              return (result, end-begin)

showZero "" = "0 secs"
showZero s  = s

showCPUTime :: Integer -> String
showCPUTime t = let s     = show t
                    l     = length s
                    (p,f) = splitAt (l - 12) s
                in case compare l 12 of GT -> p ++ '.' : take (13 - lenPrec) f
                                        EQ -> "0." ++ take (13 - lenPrec) f
                                        LT -> "0." ++ replicate (12-l) '0' ++ take (12 - lenPrec) s
lenPrec = length (show cpuTimePrecision)