1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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"
|