0 | module IotaTime.Calendar.Component
2 | import public Data.So
10 | integerValue : Integer
14 | left == right = left.integerValue == right.integerValue
18 | compare left right = compare left.integerValue right.integerValue
22 | show value = show value.integerValue
26 | MkYear left + MkYear right = MkYear (left + right)
27 | MkYear left * MkYear right = MkYear (left * right)
28 | fromInteger = MkYear
32 | negate (MkYear value) = MkYear (negate value)
33 | MkYear left - MkYear right = MkYear (left - right)
38 | fromInteger : Integer -> Year
39 | fromInteger = MkYear
43 | yearValue : Year -> Integer
44 | yearValue (MkYear value) = value
47 | yearFromInteger : Integer -> Year
48 | yearFromInteger = MkYear
52 | record DayOfMonth where
53 | constructor MkDayOfMonth
54 | integerValue : Integer
58 | isValidDayOfMonth : Integer -> Bool
59 | isValidDayOfMonth value = value >= 1 && value <= 31
63 | left == right = left.integerValue == right.integerValue
66 | Ord DayOfMonth where
67 | compare left right = compare left.integerValue right.integerValue
70 | Show DayOfMonth where
71 | show value = show value.integerValue
73 | namespace DayOfMonth
76 | fromInteger : (value : Integer) ->
77 | {auto 0 valid : So (isValidDayOfMonth value)} ->
79 | fromInteger value = MkDayOfMonth value
83 | dayOfMonthValue : DayOfMonth -> Integer
84 | dayOfMonthValue (MkDayOfMonth value) = value
87 | dayOfMonthFromInteger : Integer -> DayOfMonth
88 | dayOfMonthFromInteger value = MkDayOfMonth (max 1 (min 31 value))
92 | data DayOfMonthError = DayOfMonthOutOfRange Integer
96 | refineDayOfMonth : (value : Integer) -> Either DayOfMonthError DayOfMonth
97 | refineDayOfMonth value =
98 | case choose (isValidDayOfMonth value) of
99 | Left valid => Right (DayOfMonth.fromInteger value @{valid})
100 | Right _ => Left (DayOfMonthOutOfRange value)
104 | record WeekNumber where
105 | constructor MkWeekNumber
106 | integerValue : Integer
109 | Eq WeekNumber where
110 | left == right = left.integerValue == right.integerValue
113 | Ord WeekNumber where
114 | compare left right = compare left.integerValue right.integerValue
117 | Show WeekNumber where
118 | show value = show value.integerValue
121 | Num WeekNumber where
122 | MkWeekNumber left + MkWeekNumber right = MkWeekNumber (left + right)
123 | MkWeekNumber left * MkWeekNumber right = MkWeekNumber (left * right)
124 | fromInteger = MkWeekNumber
127 | Neg WeekNumber where
128 | negate (MkWeekNumber value) = MkWeekNumber (negate value)
129 | MkWeekNumber left - MkWeekNumber right = MkWeekNumber (left - right)
131 | namespace WeekNumber
134 | fromInteger : Integer -> WeekNumber
135 | fromInteger = MkWeekNumber
139 | weekNumberValue : WeekNumber -> Integer
140 | weekNumberValue (MkWeekNumber value) = value