From fbd3d2b4503c486f7d835697252ce8b1e39eea3e Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 24 Jul 2012 22:42:21 -0700 Subject: Better algorithm for oneOfStrings. This goes character by character, not backtracking. --- src/Text/Pandoc/Parsing.hs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src/Text') diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index c04db4d60..145ad64c5 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -173,9 +173,16 @@ notFollowedBy' p = try $ join $ do a <- try p return (return ()) -- (This version due to Andrew Pimlott on the Haskell mailing list.) --- | Parses one of a list of strings (tried in order). +-- | Parses one of a list of strings (tried in order). oneOfStrings :: [String] -> Parsec [Char] st String -oneOfStrings listOfStrings = choice $ map (try . string) listOfStrings +oneOfStrings [] = fail "no strings" +oneOfStrings strs = do + c <- anyChar + let strs' = [xs | (x:xs) <- strs, x == c] + case strs' of + [] -> fail "not found" + z | "" `elem` z -> return [c] + | otherwise -> (c:) `fmap` oneOfStrings strs' -- | Parses a space or tab. spaceChar :: Parsec [Char] st Char -- cgit v1.2.3