lib: splitSpan: return no spans for an empty datespan
Fixes an issue where a bounded budget could wrongly appear in a disjoint report period.
This commit is contained in:
parent
4d562ef068
commit
d060398484
@ -149,8 +149,12 @@ spanEnd (DateSpan _ d) = d
|
|||||||
spansSpan :: [DateSpan] -> DateSpan
|
spansSpan :: [DateSpan] -> DateSpan
|
||||||
spansSpan spans = DateSpan (maybe Nothing spanStart $ headMay spans) (maybe Nothing spanEnd $ lastMay spans)
|
spansSpan spans = DateSpan (maybe Nothing spanStart $ headMay spans) (maybe Nothing spanEnd $ lastMay spans)
|
||||||
|
|
||||||
-- | Split a DateSpan into one or more consecutive whole spans of the specified length which enclose it.
|
-- | Split a DateSpan into consecutive whole spans of the specified interval
|
||||||
|
-- which fully encompass the original span (and a little more when necessary).
|
||||||
-- If no interval is specified, the original span is returned.
|
-- If no interval is specified, the original span is returned.
|
||||||
|
-- If the original span is the null date span, ie unbounded, the null date span is returned.
|
||||||
|
-- If the original span is empty, eg if the end date is <= the start date, no spans are returned.
|
||||||
|
--
|
||||||
--
|
--
|
||||||
-- ==== Examples:
|
-- ==== Examples:
|
||||||
-- >>> let t i d1 d2 = splitSpan i $ mkdatespan d1 d2
|
-- >>> let t i d1 d2 = splitSpan i $ mkdatespan d1 d2
|
||||||
@ -161,9 +165,9 @@ spansSpan spans = DateSpan (maybe Nothing spanStart $ headMay spans) (maybe Noth
|
|||||||
-- >>> splitSpan (Quarters 1) nulldatespan
|
-- >>> splitSpan (Quarters 1) nulldatespan
|
||||||
-- [DateSpan -]
|
-- [DateSpan -]
|
||||||
-- >>> t (Days 1) "2008/01/01" "2008/01/01" -- an empty datespan
|
-- >>> t (Days 1) "2008/01/01" "2008/01/01" -- an empty datespan
|
||||||
-- [DateSpan 2008/01/01-2007/12/31]
|
-- []
|
||||||
-- >>> t (Quarters 1) "2008/01/01" "2008/01/01"
|
-- >>> t (Quarters 1) "2008/01/01" "2008/01/01"
|
||||||
-- [DateSpan 2008/01/01-2007/12/31]
|
-- []
|
||||||
-- >>> t (Months 1) "2008/01/01" "2008/04/01"
|
-- >>> t (Months 1) "2008/01/01" "2008/04/01"
|
||||||
-- [DateSpan 2008/01,DateSpan 2008/02,DateSpan 2008/03]
|
-- [DateSpan 2008/01,DateSpan 2008/02,DateSpan 2008/03]
|
||||||
-- >>> t (Months 2) "2008/01/01" "2008/04/01"
|
-- >>> t (Months 2) "2008/01/01" "2008/04/01"
|
||||||
@ -185,6 +189,7 @@ spansSpan spans = DateSpan (maybe Nothing spanStart $ headMay spans) (maybe Noth
|
|||||||
--
|
--
|
||||||
splitSpan :: Interval -> DateSpan -> [DateSpan]
|
splitSpan :: Interval -> DateSpan -> [DateSpan]
|
||||||
splitSpan _ (DateSpan Nothing Nothing) = [DateSpan Nothing Nothing]
|
splitSpan _ (DateSpan Nothing Nothing) = [DateSpan Nothing Nothing]
|
||||||
|
splitSpan _ s | isEmptySpan s = []
|
||||||
splitSpan NoInterval s = [s]
|
splitSpan NoInterval s = [s]
|
||||||
splitSpan (Days n) s = splitspan startofday (applyN n nextday) s
|
splitSpan (Days n) s = splitspan startofday (applyN n nextday) s
|
||||||
splitSpan (Weeks n) s = splitspan startofweek (applyN n nextweek) s
|
splitSpan (Weeks n) s = splitspan startofweek (applyN n nextweek) s
|
||||||
@ -222,6 +227,12 @@ daysInSpan :: DateSpan -> Maybe Integer
|
|||||||
daysInSpan (DateSpan (Just d1) (Just d2)) = Just $ diffDays d2 d1
|
daysInSpan (DateSpan (Just d1) (Just d2)) = Just $ diffDays d2 d1
|
||||||
daysInSpan _ = Nothing
|
daysInSpan _ = Nothing
|
||||||
|
|
||||||
|
-- | Is this an empty span, ie closed with the end date on or before the start date ?
|
||||||
|
isEmptySpan :: DateSpan -> Bool
|
||||||
|
isEmptySpan s = case daysInSpan s of
|
||||||
|
Just n -> n < 1
|
||||||
|
Nothing -> False
|
||||||
|
|
||||||
-- | Does the span include the given date ?
|
-- | Does the span include the given date ?
|
||||||
spanContainsDate :: DateSpan -> Day -> Bool
|
spanContainsDate :: DateSpan -> Day -> Bool
|
||||||
spanContainsDate (DateSpan Nothing Nothing) _ = True
|
spanContainsDate (DateSpan Nothing Nothing) _ = True
|
||||||
@ -240,6 +251,10 @@ spansIntersect [d] = d
|
|||||||
spansIntersect (d:ds) = d `spanIntersect` (spansIntersect ds)
|
spansIntersect (d:ds) = d `spanIntersect` (spansIntersect ds)
|
||||||
|
|
||||||
-- | Calculate the intersection of two datespans.
|
-- | Calculate the intersection of two datespans.
|
||||||
|
--
|
||||||
|
-- For non-intersecting spans, gives an empty span beginning on the second's start date:
|
||||||
|
-- >>> mkdatespan "2018-01-01" "2018-01-03" `spanIntersect` mkdatespan "2018-01-03" "2018-01-05"
|
||||||
|
-- DateSpan 2018/01/03-2018/01/02
|
||||||
spanIntersect (DateSpan b1 e1) (DateSpan b2 e2) = DateSpan b e
|
spanIntersect (DateSpan b1 e1) (DateSpan b2 e2) = DateSpan b e
|
||||||
where
|
where
|
||||||
b = latest b1 b2
|
b = latest b1 b2
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user