From 08ad2204483ab55f02a5190874ad11ce9d56ed85 Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Mon, 3 Aug 2020 16:01:12 +1000 Subject: [PATCH] lib: In quarterdatespanp, use yearp and allow uppercase Q. --- hledger-lib/Hledger/Data/Dates.hs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/hledger-lib/Hledger/Data/Dates.hs b/hledger-lib/Hledger/Data/Dates.hs index 45df9ce33..517a06a30 100644 --- a/hledger-lib/Hledger/Data/Dates.hs +++ b/hledger-lib/Hledger/Data/Dates.hs @@ -85,7 +85,7 @@ import Control.Applicative (liftA2) import Control.Applicative.Permutations import Control.Monad (guard, unless) import "base-compat-batteries" Data.List.Compat -import Data.Char (isDigit) +import Data.Char (digitToInt, isDigit, ord) import Data.Default import Data.Foldable (asum) import Data.Function (on) @@ -997,15 +997,17 @@ doubledatespanp rdate = liftA2 fromToSpan -- | -- >>> parsewith (quarterdatespanp (parsedate "2018/01/01") <* eof) "q1" -- Right DateSpan 2018Q1 +-- >>> parsewith (quarterdatespanp (parsedate "2018/01/01") <* eof) "Q1" +-- Right DateSpan 2018Q1 -- >>> parsewith (quarterdatespanp (parsedate "2018/01/01") <* eof) "2020q4" -- Right DateSpan 2020Q4 quarterdatespanp :: Day -> TextParser m DateSpan quarterdatespanp rdate = do - let defaultYear = first3 $ toGregorian rdate - y <- maybe defaultYear read <$> optional (count 4 digitChar) - char 'q' - q <- oneOf ("1234"::[Char]) - return $ periodAsDateSpan $ QuarterPeriod y $ read [q] + y <- yearp <|> pure (first3 $ toGregorian rdate) + q <- char' 'q' *> satisfy is4Digit + return . periodAsDateSpan $ QuarterPeriod y (digitToInt q) + where + is4Digit c = (fromIntegral (ord c - ord '1') :: Word) <= 3 fromdatespanp :: Day -> TextParser m DateSpan fromdatespanp rdate = fromSpan <$> choice