module Parsers where import Text.ParserCombinators.Parsec import Data.Maybe (catMaybes) import Data.Char (toUpper) import Control.Monad (liftM) -- Parsing functions not in Text.ParserCombinators.Parsec -- There is also a good ine in hsemail, manyNtoM countBetween m n p | n < m = error "First bound must be lower or equal than second bound" | otherwise = do xs <- try (count m p) ys <- try (count (n - m) ((option Nothing) (do y <- p return (Just y)))) return (xs ++ catMaybes ys) facultative p = liftM Just p <|> return Nothing -- Case-insensitive parsers stloen from hsemail -- Case-insensitive variant of Parsec's 'char' function. ichar :: Char -> CharParser st Char ichar c = satisfy (\x -> toUpper x == toUpper c) -- Case-insensitive variant of Parsec's 'string' function. istring :: String -> CharParser st String istring cs = mapM ichar cs cs -- -- End of parsing functions