0 | module IotaTime.Pattern.ZonedDateTime
2 | import IotaTime.Calendar.Gregorian
3 | import IotaTime.CalendarDateTime
4 | import IotaTime.TimeZone
5 | import IotaTime.Pattern
6 | import IotaTime.Pattern.Calendar
7 | import IotaTime.Pattern.CalendarDate
8 | import IotaTime.Pattern.CalendarDateTime
9 | import IotaTime.Pattern.LocalTime
10 | import IotaTime.Pattern.Scalar
11 | import IotaTime.Period
12 | import IotaTime.ZonedDateTime
19 | record ZonedDateTimePattern state value where
20 | constructor MkZonedDateTimePattern
21 | zonedFormatPart : value -> String
26 | zonedDateTimePattern :
27 | {calendar : Type} -> {auto patterned : CalendarPattern calendar} ->
28 | Pattern state (CalendarDateTime calendar) ->
29 | (ZonedDateTime calendar -> String) ->
30 | ZonedDateTimePattern state (ZonedDateTime calendar)
31 | zonedDateTimePattern local render = MkZonedDateTimePattern
32 | (\value => IotaTime.Pattern.format local
33 | (IotaTime.ZonedDateTime.toCalendarDateTime value) ++ render value)
37 | formatZonedDateTime : ZonedDateTimePattern state value -> value -> String
38 | formatZonedDateTime pattern = pattern.zonedFormatPart
42 | pZonedDateTime : {calendar : Type} ->
43 | {auto patterned : CalendarPattern calendar} ->
44 | ZonedDateTimePattern (DateFields, TimeFields) (ZonedDateTime calendar)
45 | pZonedDateTime = zonedDateTimePattern ps
46 | (\value => " " ++ IotaTime.ZonedDateTime.zoneId value)
51 | pZonedDateTimeQuoted : {calendar : Type} ->
52 | {auto patterned : CalendarPattern calendar} ->
53 | ZonedDateTimePattern (DateFields, TimeFields) (ZonedDateTime calendar)
54 | pZonedDateTimeQuoted = zonedDateTimePattern ps
55 | (\value => " " ++ IotaTime.Pattern.format pZoneIdQuoted
56 | (IotaTime.ZonedDateTime.zoneId value))
59 | data ZonedDateTimePatternError providerError resolverError
60 | = ZonedDateTimeParseError PatternError
61 | | ZonedDateTimeProviderError providerError
62 | | ZonedDateTimeResolutionError resolverError
64 | zoneInfoPattern : {calendar : Type} ->
65 | {auto patterned : CalendarPattern calendar} ->
66 | Pattern state (CalendarDateTime calendar) ->
67 | Pattern zoneState String ->
68 | Pattern (state, zoneState) (CalendarDateTime calendar, String)
69 | zoneInfoPattern local zone = pairPattern fst snd
70 | (\dateTime, zoneId => (dateTime, zoneId))
71 | (local <% char ' ') zone
77 | parseZonedDateTimePatternWith :
78 | {m : Type -> Type} -> Monad m =>
79 | {calendar : Type} -> {auto patterned : CalendarPattern calendar} ->
80 | Pattern state (CalendarDateTime calendar) ->
81 | Pattern zoneState String ->
82 | (String -> m (Either providerError TimeZone)) ->
83 | (CalendarDateTime calendar -> TimeZone ->
84 | Either resolverError (ZonedDateTime calendar)) ->
86 | m (Either (ZonedDateTimePatternError providerError resolverError)
87 | (ZonedDateTime calendar))
88 | parseZonedDateTimePatternWith local zone provider resolver source =
89 | case IotaTime.Pattern.parse (zoneInfoPattern local zone) source of
90 | Left error => pure (Left (ZonedDateTimeParseError error))
91 | Right (dateTime, zoneId) => do
92 | loaded <- provider zoneId
93 | pure $
case loaded of
94 | Left error => Left (ZonedDateTimeProviderError error)
95 | Right valueZone => case resolver dateTime valueZone of
96 | Left error => Left (ZonedDateTimeResolutionError error)
97 | Right value => Right value
104 | parseZonedDateTimeWith :
105 | {m : Type -> Type} -> Monad m =>
106 | {calendar : Type} -> {auto patterned : CalendarPattern calendar} ->
107 | Pattern state (CalendarDateTime calendar) ->
108 | (String -> m (Either providerError TimeZone)) ->
109 | (CalendarDateTime calendar -> TimeZone ->
110 | Either resolverError (ZonedDateTime calendar)) ->
112 | m (Either (ZonedDateTimePatternError providerError resolverError)
113 | (ZonedDateTime calendar))
114 | parseZonedDateTimeWith local provider resolver source =
115 | parseZonedDateTimePatternWith local pZoneIdToken provider resolver source
120 | parseStandardZonedDateTime :
121 | {m : Type -> Type} -> Monad m =>
122 | {calendar : Type} -> {auto patterned : CalendarPattern calendar} ->
123 | (String -> m (Either providerError TimeZone)) ->
124 | (CalendarDateTime calendar -> TimeZone ->
125 | Either resolverError (ZonedDateTime calendar)) ->
127 | m (Either (ZonedDateTimePatternError providerError resolverError)
128 | (ZonedDateTime calendar))
129 | parseStandardZonedDateTime = parseZonedDateTimeWith ps