diff options
Diffstat (limited to 'Diddo.hs')
-rw-r--r-- | Diddo.hs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Diddo.hs b/Diddo.hs new file mode 100644 index 0000000..cbbbce0 --- /dev/null +++ b/Diddo.hs @@ -0,0 +1,87 @@ +module Diddo +( LogLine(LogLine) +, LogEntry(LogEntry) +, DiddoEntry(DiddoEntry) +, DiddoEntry2(DiddoEntry2) +, parseDiddoLogline +, formatDiddoEntry +, timestamp +, logToDiddoEntry +) where + +import HMSTime( HMSTime, secondsToHMS ) +import Data.List( intercalate ) +import Data.DateTime( diffSeconds ) +import Data.Time.LocalTime( TimeZone() ) +import Data.Time.Clock( UTCTime() ) +import Data.Maybe( fromMaybe, fromJust ) +import Data.Time.Format( parseTime, formatTime ) +import Data.Time.LocalTime( LocalTime(..), ZonedTime(..), TimeZone(..), zonedTimeToUTC, utcToZonedTime, midnight, localDay ) +import Data.List.Split( splitOn ) +import System.Locale + +data LogLine + = LogLine String + +instance Show LogLine where + show (LogLine x) = x + +data LogEntry + = LogEntry + { timestamp :: UTCTime + , timezone :: TimeZone + , text :: String + } + +instance Show LogEntry where + show x = (show $ timestamp x) ++ (show $ timezone x) ++ text x + +data DiddoEntry = DiddoEntry String String HMSTime String + +data DiddoEntry2 = DiddoEntry2 + { startTime :: ZonedTime + , endTime :: ZonedTime + , comment :: String + } + +instance Show DiddoEntry where + show (DiddoEntry start finish delta entry) = intercalate ";" [start,finish,(show delta),entry] + +instance Show DiddoEntry2 where + show (DiddoEntry2 start finish entry) = intercalate ";" [show start,show finish,show $ diffSeconds (zonedTimeToUTC finish) (zonedTimeToUTC start),entry] + +formatDiddoEntry :: String -> DiddoEntry2 -> String +formatDiddoEntry format (DiddoEntry2 start end comment) = (formatTime defaultTimeLocale format start) ++ ";" ++ (formatTime defaultTimeLocale format end) ++ ";" ++ (show $ secondsToHMS $ diffSeconds (zonedTimeToUTC end) (zonedTimeToUTC start)) ++ ";" ++ comment + +logToDiddoEntry :: UTCTime -> LogEntry -> DiddoEntry2 +logToDiddoEntry startutc logentry = DiddoEntry2 startZoned endZoned $ text logentry + where + startZoned = utcToZonedTime (timezone logentry) startutc + endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry + + +lineToEntry :: LogLine -> LogEntry +lineToEntry (LogLine line) = LogEntry ts tz text + where + splitLine = splitOn ";" line + text = intercalate ";" $ tail splitLine + time = parseISOsecondsTime $ head splitLine + (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time) + +parseDiddoLogline :: String -> LogEntry +parseDiddoLogline line = LogEntry ts tz text + where + splitLine = splitOn ";" line + text = intercalate ";" $ tail splitLine + time = parseISOsecondsTime $ head splitLine + (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time) + + + + +parseToZonedTime :: String -> String -> ZonedTime +parseToZonedTime format string = fromMaybe (error $ "Input data broken: " ++ string) $ parseTime defaultTimeLocale format string + +parseISOsecondsTime :: String -> ZonedTime +parseISOsecondsTime = parseToZonedTime $ iso8601DateFormat $ Just "%T%z" + |