0 | module Data.Time.Time
2 | import public Data.Nat
3 | import public Data.Refined
4 | import public Data.Time.Date
5 | import public Data.Refined.Integer
7 | import Derive.Prelude
8 | import Derive.Refined
11 | %language ElabReflection
21 | {auto 0 valid : FromTo 0 23 hour}
24 | %runElab derive "Hour" [Show, Eq, Ord, RefinedInteger]
27 | Interpolation Hour where
28 | interpolate (H h) = padLeft 2 '0' $
show h
38 | {auto 0 valid : FromTo 0 59 minute}
41 | %runElab derive "Minute" [Show, Eq, Ord, RefinedInteger]
44 | Interpolation Minute where
45 | interpolate (M m) = padLeft 2 '0' $
show m
55 | {auto 0 valid : FromTo 0 60 second}
58 | %runElab derive "Second" [Show, Eq, Ord, RefinedInteger]
61 | Interpolation Second where
62 | interpolate (S s) = padLeft 2 '0' $
show s
69 | record MicroSecond where
72 | {auto 0 valid : FromTo 0 999_999 us}
74 | namespace MicroSecond
75 | %runElab derive "MicroSecond" [Show, Eq, Ord, RefinedInteger]
78 | Interpolation MicroSecond where
79 | interpolate (MS n) = padLeft 6 '0' $
show n
86 | record LocalTime where
91 | prec : Maybe MicroSecond
93 | %runElab derive "LocalTime" [Show, Eq, Ord]
96 | Interpolation LocalTime where
97 | interpolate (LT h m s ms) =
98 | let mss := maybe "" (\x => ".\{x}") ms
99 | in "\{h}:\{m}:\{s}\{mss}"
106 | data Sign = Minus | Plus
108 | %runElab derive "Sign" [Show, Eq, Ord]
111 | Interpolation Sign where
112 | interpolate Minus = "-"
113 | interpolate Plus = "+"
120 | data Offset : Type where
122 | O : (sign : Sign) -> (h : Hour) -> (m : Minute) -> Offset
124 | %runElab derive "Offset" [Show, Eq]
127 | Interpolation Offset where
128 | interpolate Z = "Z"
129 | interpolate (O sign h m) = "\{sign}\{h}:\{m}"
136 | record OffsetTime where
141 | %runElab derive "OffsetTime" [Show, Eq]
144 | Interpolation OffsetTime where
145 | interpolate (OT t o) = "\{t}\{o}"
152 | record LocalDateTime where
157 | %runElab derive "LocalDateTime" [Show, Eq]
160 | Interpolation LocalDateTime where
161 | interpolate (LDT d t) = "\{d}T\{t}"
164 | record OffsetDateTime where
169 | %runElab derive "OffsetDateTime" [Show, Eq]
172 | Interpolation OffsetDateTime where
173 | interpolate (ODT d t) = "\{d}T\{t}"
180 | data AnyTime : Type where
181 | ATLocalDate : LocalDate -> AnyTime
182 | ATLocalTime : LocalTime -> AnyTime
183 | ATLocalDateTime : LocalDateTime -> AnyTime
184 | ATOffsetDateTime : OffsetDateTime -> AnyTime
186 | %runElab derive "AnyTime" [Show, Eq]
189 | getDate : AnyTime -> Maybe LocalDate
190 | getDate (ATLocalDate x) = Just x
191 | getDate (ATLocalTime x) = Nothing
192 | getDate (ATLocalDateTime x) = Just x.date
193 | getDate (ATOffsetDateTime x) = Just x.date
196 | extraCheckDate : AnyTime -> Either LocalDate AnyTime
197 | extraCheckDate at =
199 | Nothing => Right at
200 | Just (MkDate y FEB 29) =>
201 | if isLeap y then Right at else Left (MkDate y FEB 29)
205 | Interpolation AnyTime where
206 | interpolate (ATLocalDate x) = interpolate x
207 | interpolate (ATLocalTime x) = interpolate x
208 | interpolate (ATLocalDateTime x) = interpolate x
209 | interpolate (ATOffsetDateTime x) = interpolate x