@@ -46,13 +46,18 @@ run p t = case A.parseOnly (p <* endOfInput) t of
4646 Left err -> fail $ "could not parse date: " ++ err
4747 Right r -> return r
4848
49−-- | Parse a date of the form @YYYY-MM-DD@.
49+-- | Parse a date of the form @[+,-]YYYY-MM-DD@.
5050day :: Parser Day
5151day = do
52+ absOrNeg <- choice
53+ [ char '-' *> pure negate
54+ , char '+' *> pure id
55+ , pure id
56+ ]
5257 y <- decimal <* char '-'
5358 m <- twoDigits <* char '-'
5459 d <- twoDigits
55− maybe (fail "invalid date") return (fromGregorianValid y m d)
60+ maybe (fail "invalid date") return (fromGregorianValid (absOrNeg y) m d)
5661
5762-- | Parse a two-digit integer (e.g. day of month, hour).
5863twoDigits :: Parser Int