import Control.Applicative( (<$>), (<*>), liftA, liftA2 ) import Data.DateTime( parseDateTime, startOfTime, diffSeconds, formatDateTime ) import Data.List( zip4, zipWith4, transpose ) import Data.List.Split( splitOn ) import Data.Maybe( fromJust, fromMaybe ) import Data.Time.Clock( secondsToDiffTime ) import System.Environment( getArgs ) import Text.Printf( printf ) data HMSTime = HMSTime { hours :: Integer, minutes :: Integer, seconds :: Integer } instance Show HMSTime where show (HMSTime h m s) = printf "%d:%02d:%02d" h m s secondsToHMS :: Integer -> HMSTime secondsToHMS seconds = HMSTime h m s where (mLeft, s) = seconds `divMod` 60 (h, m) = mLeft `divMod` 60 data DiddoEntry = DiddoEntry { start :: String , finish :: String , delta :: HMSTime , entry :: String } instance Show DiddoEntry where show (DiddoEntry start finish delta entry) = printf "%s;%s;%s;%s" start finish (show delta) entry main :: IO () main = do logfile_name : timestring_format : _ <- getArgs logfile_lines_split <- map (splitOn ";") . lines <$> readFile logfile_name let [timestrings_finish , entries ] = transpose logfile_lines_split utcTimes_finish = map (fromMaybe (error "Input data broken.") . parseDateTime timestring_format) timestrings_finish entry_deltas_HMMSS = zipWith (\x y -> secondsToHMS $ diffSeconds x y) utcTimes_finish (startOfTime : init utcTimes_finish) diddos_summarized = zipWith4 DiddoEntry ("" : init timestrings_finish) timestrings_finish entry_deltas_HMMSS entries mapM_ print diddos_summarized