mini 1.1.1.0 → 1.2.0.0
raw patch · 3 files changed
+28/−26 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Mini.Transformers.ParserT: instance GHC.Show.Show s => GHC.Show.Show (Mini.Transformers.ParserT.ParseError s)
+ Mini.Transformers.ParserT: instance GHC.Base.Monoid Mini.Transformers.ParserT.ParseError
+ Mini.Transformers.ParserT: instance GHC.Base.Semigroup Mini.Transformers.ParserT.ParseError
+ Mini.Transformers.ParserT: instance GHC.Show.Show Mini.Transformers.ParserT.ParseError
- Mini.Transformers.ParserT: ParserT :: ([s] -> m (Either [ParseError s] (a, [s]))) -> ParserT s m a
+ Mini.Transformers.ParserT: ParserT :: ([s] -> m (Either ParseError (a, [s]))) -> ParserT s m a
- Mini.Transformers.ParserT: data ParseError s
+ Mini.Transformers.ParserT: data ParseError
- Mini.Transformers.ParserT: eof :: Applicative m => ParserT s m ()
+ Mini.Transformers.ParserT: eof :: (Applicative m, Show s) => ParserT s m ()
- Mini.Transformers.ParserT: item :: Applicative m => ParserT s m s
+ Mini.Transformers.ParserT: item :: (Applicative m, Show s) => ParserT s m s
- Mini.Transformers.ParserT: noneOf :: (Applicative m, Foldable t, Eq s) => t s -> ParserT s m s
+ Mini.Transformers.ParserT: noneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s
- Mini.Transformers.ParserT: oneOf :: (Applicative m, Foldable t, Eq s) => t s -> ParserT s m s
+ Mini.Transformers.ParserT: oneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s
- Mini.Transformers.ParserT: runParserT :: ParserT s m a -> [s] -> m (Either [ParseError s] (a, [s]))
+ Mini.Transformers.ParserT: runParserT :: ParserT s m a -> [s] -> m (Either ParseError (a, [s]))
- Mini.Transformers.ParserT: sat :: Applicative m => (s -> Bool) -> ParserT s m s
+ Mini.Transformers.ParserT: sat :: (Applicative m, Show s) => (s -> Bool) -> ParserT s m s
- Mini.Transformers.ParserT: string :: (Monad m, Traversable t, Eq s) => t s -> ParserT s m (t s)
+ Mini.Transformers.ParserT: string :: (Monad m, Traversable t, Show s, Eq s) => t s -> ParserT s m (t s)
- Mini.Transformers.ParserT: symbol :: (Applicative m, Eq s) => s -> ParserT s m s
+ Mini.Transformers.ParserT: symbol :: (Applicative m, Show s, Eq s) => s -> ParserT s m s
Files
- CHANGELOG.md +5/−0
- Mini/Transformers/ParserT.hs +22/−25
- mini.cabal +1/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+1.2.0.0 [2024-03-15]+--------------------+* Mini.Transformers.ParserT:+ * Simplify parse errors+ 1.1.1.0 [2024-03-14] -------------------- * Mini.Transformers.ParserT:
Mini/Transformers/ParserT.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE TupleSections #-} @@ -52,6 +53,9 @@ import Data.Functor ( (<&>), )+import Data.List (+ intersperse,+ ) import Mini.Transformers.Class ( MonadTrans ( lift@@ -64,7 +68,7 @@ -- | A transformer parsing symbols /s/, inner monad /m/, return /a/ newtype ParserT s m a = ParserT- { runParserT :: [s] -> m (Either [ParseError s] (a, [s]))+ { runParserT :: [s] -> m (Either ParseError (a, [s])) -- ^ Unwrap a 'ParserT' computation with a sequence of symbols to parse } @@ -76,7 +80,7 @@ (<*>) = ap instance (Monad m, Eq s) => Alternative (ParserT s m) where- empty = ParserT . const . pure $ Left [EmptyError]+ empty = ParserT . const . pure $ Left mempty m <|> n = ParserT $ \ss -> runParserT m ss >>= either@@ -106,61 +110,54 @@ mempty = pure mempty instance (Monad m) => MonadFail (ParserT s m) where- fail msg = ParserT . const . pure $ Left [FailError msg]+ fail = ParserT . const . pure . Left . ParseError . pure --- | Abstract representation of a parse error for symbols /s/-data ParseError s- = EndOfInput- | Unexpected s- | EmptyError- | FailError String+-- | Abstract representation of a parse error+newtype ParseError = ParseError [String]+ deriving (Semigroup, Monoid) -instance (Show s) => Show (ParseError s) where- show = \case- EndOfInput -> "unexpected EOF"- Unexpected s -> "unexpected " <> show s- EmptyError -> "empty"- FailError msg -> msg+instance Show ParseError where+ show (ParseError es) = "(parse error: " <> concat (intersperse ", " es) <> ")" {- - Parsers -} -- | Parse symbols satisfying a predicate-sat :: (Applicative m) => (s -> Bool) -> ParserT s m s+sat :: (Applicative m, Show s) => (s -> Bool) -> ParserT s m s sat p = ParserT $ \case- [] -> pure $ Left [EndOfInput]+ [] -> pure . Left $ ParseError ["end of input"] (s : ss) -> bool- (pure $ Left [Unexpected s])+ (pure . Left $ ParseError ["unexpected " <> show s]) (pure $ Right (s, ss)) $ p s -- | Parse any symbol-item :: (Applicative m) => ParserT s m s+item :: (Applicative m, Show s) => ParserT s m s item = sat $ const True -- | Parse a symbol-symbol :: (Applicative m, Eq s) => s -> ParserT s m s+symbol :: (Applicative m, Show s, Eq s) => s -> ParserT s m s symbol = sat . (==) -- | Parse a sequence of symbols-string :: (Monad m, Traversable t, Eq s) => t s -> ParserT s m (t s)+string :: (Monad m, Traversable t, Show s, Eq s) => t s -> ParserT s m (t s) string = traverse symbol -- | Parse symbols included in a collection-oneOf :: (Applicative m, Foldable t, Eq s) => t s -> ParserT s m s+oneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s oneOf = sat . flip elem -- | Parse symbols excluded from a collection-noneOf :: (Applicative m, Foldable t, Eq s) => t s -> ParserT s m s+noneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s noneOf = sat . flip notElem -- | Parse successfully only at end of input-eof :: (Applicative m) => ParserT s m ()+eof :: (Applicative m, Show s) => ParserT s m () eof = ParserT $ \case [] -> pure $ Right ((), [])- (s : _) -> pure $ Left [Unexpected s]+ (s : _) -> pure . Left $ ParseError ["unexpected " <> show s] {- - Combinators
mini.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: mini-version: 1.1.1.0+version: 1.2.0.0 license: MIT license-file: LICENSE copyright: (c) 2023-2024 Victor Wallsten