0 | module IotaTime.Period
2 | import IotaTime.Internal.ApplyPeriod
9 | record Period (target : Type) where
10 | constructor MkPeriod
11 | storedYears : Integer
12 | storedMonths : Integer
13 | storedWeeks : Integer
14 | storedDays : Integer
15 | storedHours : Integer
16 | storedMinutes : Integer
17 | storedSeconds : Integer
18 | storedNanoseconds : Integer
21 | periodYears : Period target -> Integer
22 | periodYears (MkPeriod value _ _ _ _ _ _ _) = value
25 | periodMonths : Period target -> Integer
26 | periodMonths (MkPeriod _ value _ _ _ _ _ _) = value
29 | periodWeeks : Period target -> Integer
30 | periodWeeks (MkPeriod _ _ value _ _ _ _ _) = value
33 | periodDays : Period target -> Integer
34 | periodDays (MkPeriod _ _ _ value _ _ _ _) = value
37 | periodHours : Period target -> Integer
38 | periodHours (MkPeriod _ _ _ _ value _ _ _) = value
41 | periodMinutes : Period target -> Integer
42 | periodMinutes (MkPeriod _ _ _ _ _ value _ _) = value
45 | periodSeconds : Period target -> Integer
46 | periodSeconds (MkPeriod _ _ _ _ _ _ value _) = value
49 | periodNanoseconds : Period target -> Integer
50 | periodNanoseconds (MkPeriod _ _ _ _ _ _ _ value) = value
53 | Eq (Period target) where
54 | MkPeriod leftYears leftMonths leftWeeks leftDays
55 | leftHours leftMinutes leftSeconds leftNanoseconds ==
56 | MkPeriod rightYears rightMonths rightWeeks rightDays
57 | rightHours rightMinutes rightSeconds rightNanoseconds =
58 | leftYears == rightYears &&
59 | leftMonths == rightMonths &&
60 | leftWeeks == rightWeeks &&
61 | leftDays == rightDays &&
62 | leftHours == rightHours &&
63 | leftMinutes == rightMinutes &&
64 | leftSeconds == rightSeconds &&
65 | leftNanoseconds == rightNanoseconds
68 | Show (Period target) where
69 | show value = "period " ++
70 | show (periodYears value) ++ " " ++
71 | show (periodMonths value) ++ " " ++
72 | show (periodWeeks value) ++ " " ++
73 | show (periodDays value) ++ " " ++
74 | show (periodHours value) ++ " " ++
75 | show (periodMinutes value) ++ " " ++
76 | show (periodSeconds value) ++ " " ++
77 | show (periodNanoseconds value)
79 | emptyPeriod : Period target
80 | emptyPeriod = MkPeriod 0 0 0 0 0 0 0 0
83 | Semigroup (Period target) where
84 | left <+> right = MkPeriod
85 | (periodYears left + periodYears right)
86 | (periodMonths left + periodMonths right)
87 | (periodWeeks left + periodWeeks right)
88 | (periodDays left + periodDays right)
89 | (periodHours left + periodHours right)
90 | (periodMinutes left + periodMinutes right)
91 | (periodSeconds left + periodSeconds right)
92 | (periodNanoseconds left + periodNanoseconds right)
95 | Monoid (Period target) where
96 | neutral = emptyPeriod
100 | interface HasCalendar target where
101 | 0 calendarCapability : ()
105 | interface HasTime target where
106 | 0 timeCapability : ()
111 | interface PeriodTarget target => ApplyPeriod target where
126 | applyPeriod : Period target -> target -> target
130 | years : HasCalendar target => Integer -> Period target
131 | years value = MkPeriod value 0 0 0 0 0 0 0
135 | months : HasCalendar target => Integer -> Period target
136 | months value = MkPeriod 0 value 0 0 0 0 0 0
140 | weeks : HasCalendar target => Integer -> Period target
141 | weeks value = MkPeriod 0 0 value 0 0 0 0 0
145 | days : HasCalendar target => Integer -> Period target
146 | days value = MkPeriod 0 0 0 value 0 0 0 0
150 | hours : HasTime target => Integer -> Period target
151 | hours value = MkPeriod 0 0 0 0 value 0 0 0
155 | minutes : HasTime target => Integer -> Period target
156 | minutes value = MkPeriod 0 0 0 0 0 value 0 0
160 | seconds : HasTime target => Integer -> Period target
161 | seconds value = MkPeriod 0 0 0 0 0 0 value 0
165 | nanoseconds : HasTime target => Integer -> Period target
166 | nanoseconds = MkPeriod 0 0 0 0 0 0 0
170 | negatePeriod : Period target -> Period target
171 | negatePeriod period = MkPeriod
172 | (negate (periodYears period))
173 | (negate (periodMonths period))
174 | (negate (periodWeeks period))
175 | (negate (periodDays period))
176 | (negate (periodHours period))
177 | (negate (periodMinutes period))
178 | (negate (periodSeconds period))
179 | (negate (periodNanoseconds period))
183 | scalePeriod : Integer -> Period target -> Period target
184 | scalePeriod factor period = MkPeriod
185 | (factor * periodYears period)
186 | (factor * periodMonths period)
187 | (factor * periodWeeks period)
188 | (factor * periodDays period)
189 | (factor * periodHours period)
190 | (factor * periodMinutes period)
191 | (factor * periodSeconds period)
192 | (factor * periodNanoseconds period)