X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=Diddo.hs;h=2100b257dba6a14dc503ebc83f6d15580e53b5a7;hb=95d1857e437aa09e1161be075c654c50afd91dd8;hp=cbbbce0384d17211bc8e0f8320a0d02e0006aee2;hpb=08ebc81f4c3f63d809b9dce93a5e2f6ee5acc695;p=user%2Fhenk%2Fcode%2Fhaskell%2Fdiddohs.git diff --git a/Diddo.hs b/Diddo.hs index cbbbce0..2100b25 100644 --- a/Diddo.hs +++ b/Diddo.hs @@ -1,87 +1,80 @@ +{-# LANGUAGE OverloadedStrings #-} + module Diddo -( LogLine(LogLine) -, LogEntry(LogEntry) -, DiddoEntry(DiddoEntry) -, DiddoEntry2(DiddoEntry2) +( LogEntry(LogEntry) +, Diddo(Diddo) +, formatDiddo , parseDiddoLogline -, formatDiddoEntry -, timestamp -, logToDiddoEntry +, logToDiddo +, parseToZonedTime ) 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 Data.Maybe( fromMaybe ) +import Data.Time.Clock( UTCTime(), NominalDiffTime(), diffUTCTime ) +import Data.Time.Format( FormatTime(), parseTime, formatTime ) +import Data.Time.LocalTime( TimeZone(), ZonedTime(..), zonedTimeToUTC, utcToZonedTime ) +import Text.Parsec 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 +import Text.Printf( printf ) +import qualified Data.Text as T + +data LogEntry = LogEntry + { timestamp :: UTCTime + , timezone :: TimeZone + , text :: T.Text + } + +data Diddo = Diddo + { startTime :: ZonedTime + , endTime :: ZonedTime + , comment :: T.Text + } + +getTimestamp :: Diddo -> UTCTime +getTimestamp = zonedTimeToUTC . endTime + +formatDiddo :: String -> Diddo -> T.Text +formatDiddo format (Diddo start end text) = T.intercalate ";" diddoline + where + diddoline = [startZonedString, endZonedString, delta, text] + startZonedString = timeToText format start + endZonedString = timeToText format end + startUTC = zonedTimeToUTC start + endUTC = zonedTimeToUTC end + delta = diffTimeToHMSString $ diffUTCTime endUTC startUTC + +timeToText :: FormatTime a => String -> a -> T.Text +timeToText format = T.pack . formatTime defaultTimeLocale format + +logToDiddo :: UTCTime -> LogEntry -> Diddo +logToDiddo startutc logentry = Diddo startZoned endZoned $ text logentry where startZoned = utcToZonedTime (timezone logentry) startutc endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry +-- parseDiddoLogline' :: T.Text -> (UTCTime, LogEntry) +-- parseDiddoLogline' line = (ts, LogEntry ts tz string) -lineToEntry :: LogLine -> LogEntry -lineToEntry (LogLine line) = LogEntry ts tz text +parseDiddoLogline :: T.Text -> (UTCTime, LogEntry) +parseDiddoLogline line = (ts, LogEntry ts tz string) where - splitLine = splitOn ";" line - text = intercalate ";" $ tail splitLine - time = parseISOsecondsTime $ head splitLine - (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time) + (timestring:strings) = T.splitOn ";" line + string = T.intercalate ";" strings + time = parseISOsecondsTime timestring + (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time) -parseDiddoLogline :: String -> LogEntry -parseDiddoLogline line = LogEntry ts tz text +parseToZonedTime :: String -> String -> ZonedTime +parseToZonedTime format string = zt where - splitLine = splitOn ";" line - text = intercalate ";" $ tail splitLine - time = parseISOsecondsTime $ head splitLine - (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time) - + zt = fromMaybe (error $ "Input data broken: " ++ string) parsedTime + parsedTime = parseTime defaultTimeLocale format string +parseISOsecondsTime :: T.Text -> ZonedTime +parseISOsecondsTime timestring = parseToZonedTime (iso8601DateFormat $ Just "%T%z") $ T.unpack timestring - -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" +diffTimeToHMSString :: NominalDiffTime -> T.Text +diffTimeToHMSString delta = T.pack $ printf "%d:%02d:%02d" h m s + where + (mLeft, s) = floor delta `divMod` 60 :: (Int, Int) + (h, m) = mLeft `divMod` 60