summaryrefslogtreecommitdiff
path: root/diddohs.hs
blob: 7ee35cd3dad1b4bb50236cdd69cb778f08cd6ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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