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(..) )
13 data DiddoOpts = DiddoOpts
18 calculateDeltas :: [DateTime] -> [Integer]
19 calculateDeltas dateTimes = zipWith diffSeconds dateTimes ((startOfDay $ head dateTimes) : init dateTimes)
21 parseDateTimeFormat :: String -> String -> DateTime
22 parseDateTimeFormat format = fromMaybe (error "Input data broken.") . parseDateTime format
24 startOfDay :: DateTime -> DateTime
25 startOfDay = fromJust . parseDateTime "%x" . formatDateTime "%x"
27 mainWithOpts :: DiddoOpts -> IO ()
32 ] <- transpose . map (splitOn ";") . lines <$> readFile (inFile opts)
35 deltasHMS = map secondsToHMS $ calculateDeltas $ map (parseDateTimeFormat (inDateFmt opts)) timeStrings
36 diddos_summarized = zipWith4 DiddoEntry ("" : init timeStrings) timeStrings deltasHMS entries
38 mapM_ print diddos_summarized
41 main = execParser opts >>= mainWithOpts
43 opts = info parser mempty
45 <$> strOption ( long "indateform" )
46 <*> strOption ( long "infile" )