{-# LANGUAGE FlexibleContexts #-} module Distribution.Compat.Parsec ( P.Parsec, P.ParsecT, P.Stream, (P.), P.runParser, -- * Combinators P.between, P.option, P.optional, P.optionMaybe, P.try, P.sepBy, P.sepBy1, P.choice, -- * Char integral, P.char, P.anyChar, P.satisfy, P.space, P.spaces, P.string, munch, munch1, P.oneOf, ) where import Distribution.Compat.Prelude import Prelude () import qualified Text.Parsec as P import qualified Text.Parsec.Pos as P integral :: (P.Stream s m Char, Integral a) => P.ParsecT s u m a integral = toNumber <$> some d P. "integral" where toNumber = foldl' (\a b -> a * 10 + b) 0 d = P.tokenPrim (\c -> show [c]) (\pos c _cs -> P.updatePosChar pos c) f f '0' = Just 0 f '1' = Just 1 f '2' = Just 2 f '3' = Just 3 f '4' = Just 4 f '5' = Just 5 f '6' = Just 6 f '7' = Just 7 f '8' = Just 8 f '9' = Just 9 f _ = Nothing -- | Greedily munch characters while predicate holds. -- Require at least one character. munch1 :: P.Stream s m Char => (Char -> Bool) -> P.ParsecT s u m String munch1 = some . P.satisfy -- | Greedely munch characters while predicate holds. -- Always succeeds. munch :: P.Stream s m Char => (Char -> Bool) -> P.ParsecT s u m String munch = many . P.satisfy