lib: periodGrow, periodNext, periodPrevious
This commit is contained in:
		
							parent
							
								
									fe6d4cc7da
								
							
						
					
					
						commit
						06a567fe0a
					
				| @ -10,6 +10,8 @@ module Hledger.Data.Period | ||||
| where | ||||
| 
 | ||||
| import Data.Time.Calendar | ||||
| import Data.Time.Calendar.MonthDay | ||||
| import Data.Time.Calendar.OrdinalDate | ||||
| import Data.Time.Calendar.WeekDate | ||||
| import Data.Time.Format | ||||
| import Text.Printf | ||||
| @ -141,3 +143,50 @@ periodEnd :: Period -> Maybe Day | ||||
| periodEnd p = me | ||||
|   where | ||||
|     DateSpan _ me = periodAsDateSpan p | ||||
| 
 | ||||
| -- | Enlarge a period to the next larger common duration, if there is one. | ||||
| -- The new period will enclose the old one. A day becomes a week, | ||||
| -- a week becomes a month (whichever month the week's middle day, | ||||
| -- ie thursday, falls into), etc. A year is the largest duration | ||||
| -- and growing that has no effect. | ||||
| periodGrow :: Period -> Period | ||||
| periodGrow (DayPeriod b) = WeekPeriod $ mondayBefore b | ||||
| periodGrow (WeekPeriod b) = MonthPeriod y m | ||||
|   where (y,m) = yearMonthContainingWeek b | ||||
| periodGrow (MonthPeriod y m) = QuarterPeriod y ((m-1) `div` 3 + 1) | ||||
| periodGrow (QuarterPeriod y _) = YearPeriod y | ||||
| periodGrow (YearPeriod _) = PeriodAll | ||||
| periodGrow p = p | ||||
| 
 | ||||
| mondayBefore d = addDays (fromIntegral (1 - wd)) d | ||||
|   where | ||||
|     (_,_,wd) = toWeekDate d | ||||
| 
 | ||||
| yearMonthContainingWeek weekstart = (y,m) | ||||
|   where | ||||
|     thu = addDays 3 weekstart | ||||
|     (y,yd) = toOrdinalDate thu | ||||
|     (m,_) = dayOfYearToMonthAndDay (isLeapYear y) yd | ||||
| 
 | ||||
| -- | Move a period to the following period of same duration. | ||||
| periodNext :: Period -> Period | ||||
| periodNext (DayPeriod b) = DayPeriod (addDays 1 b) | ||||
| periodNext (WeekPeriod b) = WeekPeriod (addDays 7 b) | ||||
| periodNext (MonthPeriod y 12) = MonthPeriod (y+1) 1 | ||||
| periodNext (MonthPeriod y m) = MonthPeriod y (m+1) | ||||
| periodNext (QuarterPeriod y 4) = QuarterPeriod (y+1) 1 | ||||
| periodNext (QuarterPeriod y q) = QuarterPeriod y (q+1) | ||||
| periodNext (YearPeriod y) = YearPeriod (y+1) | ||||
| periodNext p = p | ||||
| 
 | ||||
| -- | Move a period to the preceding period of same duration. | ||||
| periodPrevious :: Period -> Period | ||||
| periodPrevious (DayPeriod b) = DayPeriod (addDays (-1) b) | ||||
| periodPrevious (WeekPeriod b) = WeekPeriod (addDays (-7) b) | ||||
| periodPrevious (MonthPeriod y 1) = MonthPeriod (y-1) 12 | ||||
| periodPrevious (MonthPeriod y m) = MonthPeriod y (m-1) | ||||
| periodPrevious (QuarterPeriod y 1) = QuarterPeriod (y-1) 4 | ||||
| periodPrevious (QuarterPeriod y q) = QuarterPeriod y (q-1) | ||||
| periodPrevious (YearPeriod y) = YearPeriod (y-1) | ||||
| periodPrevious p = p | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user