0 | module IotaTime.Time.Component
2 | import public Data.So
8 | isValidHour : Integer -> Bool
9 | isValidHour value = value >= 0 && value < 24
15 | integerValue : Integer
20 | fromInteger : (value : Integer) -> {auto 0 valid : So (isValidHour value)} -> Hour
21 | fromInteger value = MkHour value
25 | hourValue : Hour -> Integer
26 | hourValue (MkHour value) = value
30 | left == right = hourValue left == hourValue right
34 | show = show . hourValue
38 | data HourError = HourOutOfRange Integer
42 | refineHour : (value : Integer) -> Either HourError Hour
43 | refineHour value = case choose (isValidHour value) of
44 | Left valid => Right (Hour.fromInteger value @{valid})
45 | Right _ => Left (HourOutOfRange value)
49 | isValidMinute : Integer -> Bool
50 | isValidMinute value = value >= 0 && value < 60
55 | constructor MkMinute
56 | integerValue : Integer
61 | fromInteger : (value : Integer) -> {auto 0 valid : So (isValidMinute value)} -> Minute
62 | fromInteger value = MkMinute value
66 | minuteValue : Minute -> Integer
67 | minuteValue (MkMinute value) = value
71 | left == right = minuteValue left == minuteValue right
75 | show = show . minuteValue
79 | data MinuteError = MinuteOutOfRange Integer
83 | refineMinute : (value : Integer) -> Either MinuteError Minute
84 | refineMinute value = case choose (isValidMinute value) of
85 | Left valid => Right (Minute.fromInteger value @{valid})
86 | Right _ => Left (MinuteOutOfRange value)
90 | isValidSecond : Integer -> Bool
91 | isValidSecond value = value >= 0 && value < 60
96 | constructor MkSecond
97 | integerValue : Integer
102 | fromInteger : (value : Integer) -> {auto 0 valid : So (isValidSecond value)} -> Second
103 | fromInteger value = MkSecond value
107 | secondValue : Second -> Integer
108 | secondValue (MkSecond value) = value
112 | left == right = secondValue left == secondValue right
116 | show = show . secondValue
120 | data SecondError = SecondOutOfRange Integer
124 | refineSecond : (value : Integer) -> Either SecondError Second
125 | refineSecond value = case choose (isValidSecond value) of
126 | Left valid => Right (Second.fromInteger value @{valid})
127 | Right _ => Left (SecondOutOfRange value)
131 | isValidNanosecond : Integer -> Bool
132 | isValidNanosecond value = value >= 0 && value < 1000000000
136 | record Nanosecond where
137 | constructor MkNanosecond
138 | integerValue : Integer
140 | namespace Nanosecond
143 | fromInteger : (value : Integer) ->
144 | {auto 0 valid : So (isValidNanosecond value)} -> Nanosecond
145 | fromInteger value = MkNanosecond value
149 | nanosecondValue : Nanosecond -> Integer
150 | nanosecondValue (MkNanosecond value) = value
153 | Eq Nanosecond where
154 | left == right = nanosecondValue left == nanosecondValue right
157 | Show Nanosecond where
158 | show = show . nanosecondValue
162 | data NanosecondError = NanosecondOutOfRange Integer
166 | refineNanosecond : (value : Integer) -> Either NanosecondError Nanosecond
167 | refineNanosecond value = case choose (isValidNanosecond value) of
168 | Left valid => Right (Nanosecond.fromInteger value @{valid})
169 | Right _ => Left (NanosecondOutOfRange value)