]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - diddohs.hs
f54ec2d91b77da4e7f845a0337615a229c3a8654
[user/henk/code/haskell/diddohs.git] / diddohs.hs
1 import Control.Applicative( (<$>), (<*>) )
2 import Data.DateTime( DateTime(..), parseDateTime, formatDateTime, startOfTime, diffSeconds )
3 import Data.List.Split( splitOn )
4 import Data.List( zipWith4, transpose )
5 import Data.Maybe( fromJust, fromMaybe )
6 import Data.Monoid( mempty )
7 import Data.Time.Clock( secondsToDiffTime )
8 import Options.Applicative( execParser, info, strOption, long )
9 import System.Environment( getArgs )
10 import HMSTime( HMSTime(..), secondsToHMS )
11 import Diddo.Entry( DiddoEntry(..) )
12
13 data DiddoOpts = DiddoOpts
14   { inDateFmt :: String
15   , inFile :: String
16   }
17
18 calculateDeltas :: [DateTime] -> [Integer]
19 calculateDeltas dateTimes = zipWith diffSeconds dateTimes ((startOfDay $ head dateTimes) : init dateTimes)
20
21 parseDateTimeFormat :: String -> String -> DateTime
22 parseDateTimeFormat format = fromMaybe (error "Input data broken.") . parseDateTime format
23
24 startOfDay :: DateTime -> DateTime
25 startOfDay = fromJust . parseDateTime "%x" . formatDateTime "%x"
26
27 mainWithOpts :: DiddoOpts -> IO ()
28 mainWithOpts opts =
29   do
30     [ timeStrings
31       , entries
32       ]                     <- transpose . map (splitOn ";") . lines <$> readFile (inFile opts)
33
34     let
35       deltasHMS             = map secondsToHMS $ calculateDeltas $ map (parseDateTimeFormat (inDateFmt opts)) timeStrings
36       diddos_summarized     = zipWith4 DiddoEntry ("" : init timeStrings) timeStrings deltasHMS entries
37
38     mapM_ print diddos_summarized
39
40 main :: IO ()
41 main = execParser opts >>= mainWithOpts
42   where
43     opts = info parser mempty
44     parser = DiddoOpts
45       <$> strOption ( long "indateform" )
46       <*> strOption ( long "infile" )
47