]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blob - diddohs.hs
On branch optparse-applicative
[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.Monoid( mempty )
7 import Data.Time.Clock( secondsToDiffTime )
8 import Options.Applicative( execParser, info, strOption, long )
9 import System.Environment( getArgs )
10 import Text.Printf( printf )
11
12 data HMSTime = HMSTime { hours :: Integer, minutes :: Integer, seconds :: Integer }
13 instance Show HMSTime where
14   show (HMSTime h m s) = printf "%d:%02d:%02d" h m s
15
16 secondsToHMS :: Integer -> HMSTime
17 secondsToHMS seconds =  HMSTime h m s where
18                           (mLeft, s) = seconds `divMod` 60
19                           (h, m)     = mLeft `divMod` 60
20
21 data DiddoEntry = DiddoEntry {  start :: String
22                                 , finish :: String
23                                 , delta :: HMSTime
24                                 , entry :: String
25                              }
26 instance Show DiddoEntry where
27   show (DiddoEntry start finish delta entry) = printf "%s;%s;%s;%s" start finish (show delta) entry
28
29 data DiddoOpts = DiddoOpts
30   { inDateFmt :: String
31   , inFile :: String
32   }
33
34 mainWithOpts :: DiddoOpts -> IO ()
35 mainWithOpts opts = do
36   [timestrings_finish
37         , entries
38         ]                  <- transpose . map (splitOn ";") . lines <$> readFile (inFile opts)
39   let utcTimes_finish      = map (fromMaybe (error "Input data broken.") . parseDateTime (inDateFmt opts)) timestrings_finish
40       entry_deltas_HMMSS   = zipWith (\x y -> secondsToHMS $ diffSeconds x y) utcTimes_finish (startOfTime : init utcTimes_finish)
41       diddos_summarized    = zipWith4 DiddoEntry ("" : init timestrings_finish) timestrings_finish entry_deltas_HMMSS entries
42
43   mapM_ print diddos_summarized
44
45 main :: IO ()
46 main = execParser opts >>= mainWithOpts
47   where
48     opts = info parser mempty
49     parser = DiddoOpts
50       <$> strOption ( long "indateform" )
51       <*> strOption ( long "infile" )
52