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
import Preludeimport Control.Applicativeimport Data.Voidimport qualified Text.Megaparsec as Mimport qualified Text.Megaparsec.Char as Mimport qualified Text.Megaparsec.Char.Lexer as ML:{ let select :: HeadedParsec Void String (Maybe [Either Char Int], Maybe Int) select = do string' "select" endHead _targets <- optional (space1 *> targets) _limit <- optional (space1 *> limit) return (_targets, _limit) where -- Lifted versions of basic parsers: char = parse . M.char space = parse M.space space1 = parse M.space1 decimal = parse ML.decimal string' = parse . M.string' -- Syntax parsers: targets = M.sepBy1 target commaSeparator target = Left <$> char '*' <|> Right <$> decimal commaSeparator = space *> char ',' *> endHead *> space limit = string' "limit" *> endHead *> space1 *> decimal test :: String -> IO () test = M.parseTest (toParsec select <* M.eof):}
test "select 1, "1:11: |1 | select 1, | ^unexpected end of inputexpecting '*', integer, or white space
test "select limit "...unexpected end of inputexpecting integer or white space
test "select 1, 2 limit 2"(Just [Right 1,Right 2],Just 2)
Instances7Monad, Functor, MonadFail, Applicative, Alternative, MonadPlus, …
(Ord err, Stream strm) => Monad (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsecFunctor (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsec(Ord err, Stream strm) => MonadFail (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsec(Ord err, Stream strm) => Applicative (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsec(Ord err, Stream strm) => Alternative (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsecAlternation is performed only the basis of heads. Bodies do not participate.
(Ord err, Stream strm) => MonadPlus (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsecAlternation is performed only the basis of heads. Bodies do not participate.
(Ord err, Stream strm) => Selective (HeadedParsec err strm)Defined in headed-megaparsec-0.2.1.3 · HeadedMegaparsec