packages feed

megaparsec-time 0.3.0.0 → 0.3.1.0

raw patch · 7 files changed

+77/−16 lines, 7 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Text.Megaparsec.Time: daysParser :: (MonadFail m, MonadParsec e s m, Token s ~ Char) => m NominalDiffTime
+ Text.Megaparsec.Time.Byte: daysParser :: (MonadFail m, MonadParsec e s m, Token s ~ Word8) => m NominalDiffTime
+ Text.Megaparsec.Time.Char: daysParser :: (MonadFail m, MonadParsec e s m, Token s ~ Char) => m NominalDiffTime
- Text.Megaparsec.Time.Common: mkDurationParser :: MonadParsec e s m => m () -> m NominalDiffTime -> m NominalDiffTime -> m NominalDiffTime -> m NominalDiffTime
+ Text.Megaparsec.Time.Common: mkDurationParser :: MonadParsec e s m => m () -> m NominalDiffTime -> m NominalDiffTime -> m NominalDiffTime -> m NominalDiffTime -> m NominalDiffTime

Files

CHANGELOG.md view
@@ -1,5 +1,17 @@ Changelog +# [3.1.0](https://github.com/haskell-github-trust/megaparsec-time/compare/3.0.0...3.1.0) (2026-11-10)+++### Bug Fixes++* commit cabal file ([47720a3](https://github.com/haskell-github-trust/megaparsec-time/commit/47720a368b25024780b420a7c4fb117697243f89))+++### Features++* support days in duration parser ([532f879](https://github.com/haskell-github-trust/megaparsec-time/commit/532f879b362e05d08d8a37caf9a787c27b1d8e36))+ # [3.0.0](https://github.com/haskell-github-trust/megaparsec-time/compare/2.0.2...3.0.0) (2026-10-25)  ## [2.0.2](https://github.com/haskell-github-trust/megaparsec-time/compare/2.0.1...2.0.2) (2025-08-07)
megaparsec-time.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           megaparsec-time-version:        0.3.0.0+version:        0.3.1.0 synopsis:       Parsers and utilities for the Megaparsec library. description:    Common parsers and utilities to use with the Megaparsec library. category:       Parsing@@ -20,7 +20,6 @@ tested-with:     GHC == 9.10   , GHC == 9.8-  , GHC == 9.6 extra-source-files:     README.md     CHANGELOG.md
src/Text/Megaparsec/Time.hs view
@@ -13,6 +13,7 @@   DayResult,    -- * Simple parsers+  Char.daysParser,   Char.hoursParser,   Char.minutesParser,   Char.secondsParser,
src/Text/Megaparsec/Time/Byte.hs view
@@ -14,6 +14,7 @@ -- 'Data.ByteString.ByteString'). module Text.Megaparsec.Time.Byte (   -- * Simple parsers+  daysParser,   hoursParser,   minutesParser,   secondsParser,@@ -67,7 +68,7 @@   => m DayResult dayParser = mkDayParser char' fromChar digitChar toChar --- | Parse a 'NominalDiffTime' using strings like @1h23m45s@, with all+-- | Parse a 'NominalDiffTime' using strings like @2d1h23m45s@, with all -- components being optional as long as one is present. -- -- @since 0.3.0.0@@ -76,7 +77,17 @@   => MonadParsec e s m   => Token s ~ Word8   => m NominalDiffTime-durationParser = mkDurationParser space hoursParser minutesParser secondsParser+durationParser = mkDurationParser space daysParser hoursParser minutesParser secondsParser++-- | Parse a 'NominalDiffTime' from a number of days from a string like @1d@.+--+-- @since 0.3.1.0+daysParser+  :: MonadFail m+  => MonadParsec e s m+  => Token s ~ Word8+  => m NominalDiffTime+daysParser = secondsToNominalDiffTime . (* 86400) <$> posNumParser <* char (fromChar 'd')  -- | Parse a Gregorian 'Day' from a @%F@ or @%d\/%m\/%Y@ format. --
src/Text/Megaparsec/Time/Char.hs view
@@ -14,6 +14,7 @@ -- lazy 'Text'). module Text.Megaparsec.Time.Char (   -- * Simple parsers+  daysParser,   hoursParser,   minutesParser,   secondsParser,@@ -65,7 +66,7 @@   => m DayResult dayParser = mkDayParser char' id digitChar id --- | Parse a 'NominalDiffTime' using strings like @1h23m45s@, with all+-- | Parse a 'NominalDiffTime' using strings like @2d1h23m45s@, with all -- components being optional as long as one is present. -- -- @since 0.3.0.0@@ -74,7 +75,17 @@   => MonadParsec e s m   => Token s ~ Char   => m NominalDiffTime-durationParser = mkDurationParser space hoursParser minutesParser secondsParser+durationParser = mkDurationParser space daysParser hoursParser minutesParser secondsParser++-- | Parse a 'NominalDiffTime' from a number of days from a string like @1d@.+--+-- @since 0.3.1.0+daysParser+  :: MonadFail m+  => MonadParsec e s m+  => Token s ~ Char+  => m NominalDiffTime+daysParser = secondsToNominalDiffTime . (* 86400) <$> posNumParser <* char 'd'  -- | Parse a Gregorian 'Day' from a @%F@ or @%d\/%m\/%Y@ format. --
src/Text/Megaparsec/Time/Common.hs view
@@ -85,17 +85,17 @@     ]  where   str = try . traverse_ (char' . fromChar)-  shortDay = choice $ map (dayString (take 3 . show)) weekDays-  longDay = choice $ map (dayString show) weekDays+  shortDay = choice $ fmap (dayString (take 3 . show)) weekDays+  longDay = choice $ fmap (dayString show) weekDays   dayString f d = str (f d) $> d   weekDays = [Monday .. Friday]   sign = (str "-" $> negate) <|> (str "+" $> id)-  digits = map toChar <$> some digitChar+  digits = fmap toChar <$> some digitChar   absoluteDay = toEnum . read <$> digits   relativeDay = ($) <$> sign <*> (read <$> digits) --- | Build a 'NominalDiffTime' parser from hours, minutes and seconds parsers,--- with all components being optional as long as one is present.+-- | Build a 'NominalDiffTime' parser from days, hours, minutes and seconds+-- parsers, with all components being optional as long as one is present. -- -- @since 0.3.0.0 mkDurationParser@@ -103,15 +103,21 @@   => m ()   -- ^ Space parser.   -> m NominalDiffTime+  -- ^ Days parser.+  -> m NominalDiffTime   -- ^ Hours parser.   -> m NominalDiffTime   -- ^ Minutes parser.   -> m NominalDiffTime   -- ^ Seconds parser.   -> m NominalDiffTime-mkDurationParser space hoursParser minutesParser secondsParser =-  try hours <|> try minutes <|> secondsParser+mkDurationParser space daysParser hoursParser minutesParser secondsParser =+  try days <|> hms  where+  days = (+) <$> (daysParser <* space) <*> (fromMaybe 0 <$> optional (try hms))++  hms = try hours <|> try minutes <|> secondsParser+   hours = do     h <- hoursParser <* space     m <- fromMaybe 0 <$> optional (try minutes)@@ -135,7 +141,7 @@   -- ^ Convert a token to a 'Char'.   -> m Day mkGregorianDayParser toChar = do-  s <- map toChar <$> many anySingle+  s <- fmap toChar <$> many anySingle    let parseTime = flip (parseTimeM False defaultTimeLocale) s @@ -154,8 +160,8 @@   -- ^ Convert a token to a 'Char'.   -> m TimeOfDay mkTimeParser digitChar colon toChar = do-  h <- read . map toChar <$> replicateM 2 digitChar <* colon-  m <- read . map toChar <$> replicateM 2 digitChar+  h <- read . fmap toChar <$> replicateM 2 digitChar <* colon+  m <- read . fmap toChar <$> replicateM 2 digitChar    maybe     (fail (printf "invalid hours or minutes %02d:%02d" h m))
test/Text/Megaparsec/TimeSpec.hs view
@@ -38,6 +38,7 @@ import Text.Megaparsec.Time (   dateParser,   dayParser,+  daysParser,   durationParser,   gregorianDayParser,   hoursParser,@@ -143,6 +144,10 @@       parseOrPrettyError dayParser (printf "+%d" (x :: Int)) `shouldSatisfy` isLeft    describe "duration" $ do+    it "days" . forAll positive $ \d ->+      parseOrPrettyError daysParser (printf "%dd" d)+        `shouldBe` Right (secondsToNominalDiffTime (fromInteger d * 86400))+     it "hours" . forAll positive $ \h ->       parseOrPrettyError hoursParser (printf "%dh" h)         `shouldBe` Right (secondsToNominalDiffTime (fromInteger h * 3600))@@ -161,6 +166,22 @@           `shouldBe` Right (secondsToNominalDiffTime (fromInteger s))      context "duration" $ do+      context "days" $ do+        it "dhms" . forAll ((,,,) <$> positive <*> positive <*> positive <*> positive) $ \(d, h, m, s) ->+          parseOrPrettyError durationParser (printf "%dd %dh %dm %ds" d h m s)+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger ((((d * 24 + h) * 60 + m) * 60) + s)))++        it "d" . forAll positive $ \d ->+          parseOrPrettyError durationParser (printf "%dd" d)+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger (d * 86400)))++        it "ds" . forAll ((,) <$> positive <*> positive) $ \(d, s) ->+          parseOrPrettyError durationParser (printf "%dd%d" d s)+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger (d * 86400 + s)))++      it "empty" $+        parseOrPrettyError durationParser "" `shouldSatisfy` isLeft+       context "hours" $ do         it "hms" . forAll ((,,) <$> positive <*> positive <*> positive) $ \(h, m, s) ->           parseOrPrettyError durationParser (printf "%dh %dm %ds" h m s)