]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - diddohs.hs
7ee35cd3dad1b4bb50236cdd69cb778f08cd6ca8
[user/henk/code/haskell/diddohs.git] / diddohs.hs
1 import Control.Applicative( (<$>), (<*>), liftA, liftA2 )
2 import Data.DateTime( parseDateTime, startOfTime, diffSeconds, formatDateTime )
3 import Data.List( zip4, zipWith4, transpose )
4 import Data.List.Split( splitOn )
5 import Data.Maybe( fromJust, fromMaybe )
6 import Data.Time.Clock( secondsToDiffTime )
7 import System.Environment( getArgs )
8 import Text.Printf( printf )
9
10 data HMSTime = HMSTime { hours :: Integer, minutes :: Integer, seconds :: Integer }
11 instance Show HMSTime where
12   show (HMSTime h m s) = printf "%d:%02d:%02d" h m s
13
14 secondsToHMS :: Integer -> HMSTime
15 secondsToHMS seconds =  HMSTime h m s where
16                           (mLeft, s) = seconds `divMod` 60
17                           (h, m)     = mLeft `divMod` 60
18
19 data DiddoEntry = DiddoEntry {  start :: String
20                                 , finish :: String
21                                 , delta :: HMSTime
22                                 , entry :: String
23                              }
24 instance Show DiddoEntry where
25   show (DiddoEntry start finish delta entry) = printf "%s;%s;%s;%s" start finish (show delta) entry
26
27 main :: IO ()
28 main = do
29   logfile_name : timestring_format : _ <- getArgs
30   logfile_lines_split <- map (splitOn ";") . lines <$> readFile logfile_name
31
32   let [timestrings_finish
33         , entries
34         ]                  = transpose logfile_lines_split
35       utcTimes_finish      = map (fromMaybe (error "Input data broken.") . parseDateTime timestring_format) timestrings_finish
36       entry_deltas_HMMSS   = zipWith (\x y -> secondsToHMS $ diffSeconds x y) utcTimes_finish (startOfTime : init utcTimes_finish)
37       diddos_summarized    = zipWith4 DiddoEntry ("" : init timestrings_finish) timestrings_finish entry_deltas_HMMSS entries
38
39   mapM_ print diddos_summarized
40