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 +12/−0
- megaparsec-time.cabal +1/−2
- src/Text/Megaparsec/Time.hs +1/−0
- src/Text/Megaparsec/Time/Byte.hs +13/−2
- src/Text/Megaparsec/Time/Char.hs +13/−2
- src/Text/Megaparsec/Time/Common.hs +16/−10
- test/Text/Megaparsec/TimeSpec.hs +21/−0
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)