]> git.netwichtig.de Git - user/henk/code/haskell/diddohs.git/blobdiff - Diddo.hs
On branch master
[user/henk/code/haskell/diddohs.git] / Diddo.hs
diff --git a/Diddo.hs b/Diddo.hs
new file mode 100644 (file)
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"
+