@@ -46,13 +46,18 @@ run p t = case A.parseOnly (p <* endOfInput) t of
46 Left err -> fail $ "could not parse date: " ++ err
46 Left err -> fail $ "could not parse date: " ++ err
47 Right r -> return r
47 Right r -> return r
49−-- | Parse a date of the form @YYYY-MM-DD@.
49+-- | Parse a date of the form @[+,-]YYYY-MM-DD@.
50day :: Parser Day
50day :: Parser Day
53+ [ char '-' *> pure negate
54+ , char '+' *> pure id
52 y <- decimal <* char '-'
57 y <- decimal <* char '-'
53 m <- twoDigits <* char '-'
58 m <- twoDigits <* char '-'
54 d <- twoDigits
59 d <- twoDigits
55− maybe (fail "invalid date") return (fromGregorianValid y m d)
60+ maybe (fail "invalid date") return (fromGregorianValid (absOrNeg y) m d)
57-- | Parse a two-digit integer (e.g. day of month, hour).
62-- | Parse a two-digit integer (e.g. day of month, hour).
58twoDigits :: Parser Int
63twoDigits :: Parser Int