headed-megaparsec-0.1.0.1: More informative parser

Safe HaskellNone
LanguageHaskell2010

HeadedMegaparsec

Contents

Synopsis

Types

data HeadedParsec err strm a Source #

Headed parser.

Abstracts over explicit composition between consecutive megaparsec try blocks, providing for better error messages.

With headed parser you don't need to use try at all.

Examples

Expand
>>> :{
  let
    select :: HeadedParsec Void Text (Maybe [Either Char Int], Maybe Int)
    select = do
      head (string' "select")
      _targets <- optional (head space1 *> targets)
      _limit <- optional (head space1 *> limit)
      return (_targets, _limit)
      where
        targets = sepBy1 target commaSeparator
        target =
          head (Left <$> char '*') <|>
          head (Right <$> Lexer.decimal)
        commaSeparator = head (space *> char ',' *> space)
        limit =
          head (string' "limit" *> space1) *>
          tail Lexer.decimal
    test :: Text -> IO ()
    test = parseTest (toParsec select <* eof)
:}
>>> test "select 1, "
...
unexpected ','
...
>>> test "select limit "
...
unexpected end of input
expecting integer or white space
>>> test "select 1, 2 limit 2"
(Just [Right 1,Right 2],Just 2)
Instances
(Ord err, Stream strm) => Monad (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

(>>=) :: HeadedParsec err strm a -> (a -> HeadedParsec err strm b) -> HeadedParsec err strm b #

(>>) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm b #

return :: a -> HeadedParsec err strm a #

fail :: String -> HeadedParsec err strm a #

Functor (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

fmap :: (a -> b) -> HeadedParsec err strm a -> HeadedParsec err strm b #

(<$) :: a -> HeadedParsec err strm b -> HeadedParsec err strm a #

(Ord err, Stream strm) => MonadFail (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

fail :: String -> HeadedParsec err strm a #

(Ord err, Stream strm) => Applicative (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

pure :: a -> HeadedParsec err strm a #

(<*>) :: HeadedParsec err strm (a -> b) -> HeadedParsec err strm a -> HeadedParsec err strm b #

liftA2 :: (a -> b -> c) -> HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm c #

(*>) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm b #

(<*) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm a #

(Ord err, Stream strm) => Alternative (HeadedParsec err strm) Source #

Alternation is performed only the basis of heads. Bodies do not participate.

Instance details

Defined in HeadedMegaparsec

Methods

empty :: HeadedParsec err strm a #

(<|>) :: HeadedParsec err strm a -> HeadedParsec err strm a -> HeadedParsec err strm a #

some :: HeadedParsec err strm a -> HeadedParsec err strm [a] #

many :: HeadedParsec err strm a -> HeadedParsec err strm [a] #

(Ord err, Stream strm) => MonadPlus (HeadedParsec err strm) Source #

Alternation is performed only the basis of heads. Bodies do not participate.

Instance details

Defined in HeadedMegaparsec

Methods

mzero :: HeadedParsec err strm a #

mplus :: HeadedParsec err strm a -> HeadedParsec err strm a -> HeadedParsec err strm a #

(Ord err, Stream strm) => Selective (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

select :: HeadedParsec err strm (Either a b) -> HeadedParsec err strm (a -> b) -> HeadedParsec err strm b #

Execution

toParsec :: (Ord err, Stream strm) => HeadedParsec err strm a -> Parsec err strm a Source #

Convert headed parser into megaparsec parser.

Transformation

wrapToHead :: (Ord err, Stream strm) => HeadedParsec err strm a -> HeadedParsec err strm a Source #

Wrap a parser to be usable as a whole in a head block, allowing it in effect to be composed with the following parsers into a single try when executed, no matter whether it contains endHead or not.

label :: (Ord err, Stream strm) => String -> HeadedParsec err strm a -> HeadedParsec err strm a Source #

Label a headed parser. Works the same way as megaparsec's label.

dbg :: (Ord err, ShowErrorComponent err, Stream strm, Show a) => String -> HeadedParsec err strm a -> HeadedParsec err strm a Source #

Make a parser print debugging information when evaluated. The first parameter is a custom label.

This function is a wrapper around dbg. It generates two debugging entries: one for head and one for tail.

filter :: (Ord err, Stream strm) => (a -> String) -> (a -> Bool) -> HeadedParsec err strm a -> HeadedParsec err strm a Source #

Filter the results of parser based on a predicate, failing with a parameterized message.

Construction

parse :: (Ord err, Stream strm) => Parsec err strm a -> HeadedParsec err strm a Source #

Lift a megaparsec parser.

endHead :: Stream strm => HeadedParsec err strm () Source #

Make all the following parsers compose as tail.