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 Data.Time.Format( parseTime, formatTime )
9 import Data.Time.LocalTime( LocalTime(..), ZonedTime(..), zonedTimeToUTC, midnight, localDay )
10 import Diddo.Entry( DiddoEntry(..) )
11 import HMSTime( HMSTime(..), secondsToHMS )
12 import Options.Applicative( execParser, info, strOption, long, help, helper, briefDesc, fullDesc, progDesc, header, (<>) )
13 import System.Environment( getArgs )
16 data DiddoOpts = DiddoOpts
21 parseToZonedTime :: String -> String -> ZonedTime
22 parseToZonedTime format = fromMaybe (error "Input data broken.") . parseTime defaultTimeLocale format
24 parseISOsecondsTime :: String -> ZonedTime
25 parseISOsecondsTime = parseToZonedTime $ iso8601DateFormat $ Just "%T%z"
27 parseRFC822Time :: String -> ZonedTime
28 parseRFC822Time = parseToZonedTime rfc822DateFormat
30 formatZonedTime :: String -> ZonedTime -> String
31 formatZonedTime format = formatTime defaultTimeLocale format
33 zonedTimesDeltas :: ZonedTime -> [ZonedTime] -> [Integer]
34 zonedTimesDeltas startTime timestamps =
36 startTimeUTC = zonedTimeToUTC startTime
37 relevantTimestamps = dropWhile (< startTimeUTC) $ map zonedTimeToUTC timestamps
39 zipWith diffSeconds relevantTimestamps $ startTimeUTC : init relevantTimestamps
41 startOfZonedDay :: ZonedTime -> ZonedTime
42 startOfZonedDay time = ZonedTime (LocalTime day midnight) $ zonedTimeZone time
44 day = localDay $ zonedTimeToLocalTime time
46 mainWithOpts :: DiddoOpts -> IO ()
52 ] <- transpose . map (splitOn ";") . lines <$> readFile (inFile opts)
55 parseCustomTime = parseToZonedTime $ inDateFmt opts
56 -- parsedTimes = map (parseToZonedTime $ inDateFmt opts) timeStamps
57 parsedTimes = map parseCustomTime timeStamps
58 deltasHMS = map secondsToHMS $ zonedTimesDeltas (startOfZonedDay $ head parsedTimes) parsedTimes
59 diddos_summarized = zipWith4 DiddoEntry
60 ((formatZonedTime (inDateFmt opts) $ startOfZonedDay $ head parsedTimes) : init timeStamps)
61 timeStamps deltasHMS entryText
63 mapM_ print diddos_summarized
66 main = execParser opts >>= mainWithOpts
68 opts = info (helper <*> parser)
69 ( header "diddohs - A Time/Task Tracker"
70 <> progDesc "Diddoh Desc"
75 <$> strOption ( long "indateform"
76 <> help "Input date format, see date(1)"
78 <*> strOption ( long "infile" )