diff --git a/examples/Test.purs b/examples/Test.purs index adac13c..3d07562 100644 --- a/examples/Test.purs +++ b/examples/Test.purs @@ -46,7 +46,13 @@ exprTest = buildExprParser [[Infix (string "/" >>= \_ -> return (/)) AssocRight] ,[Infix (string "*" >>= \_ -> return (*)) AssocRight] ,[Infix (string "-" >>= \_ -> return (-)) AssocRight] ,[Infix (string "+" >>= \_ -> return (+)) AssocRight]] digit - + +manySatisfyTest :: Parser String [String] +manySatisfyTest = do + r <- many1 $ satisfy (\s -> s /= "?") + string "?" + return r + main = do parseTest nested "(((a)))" parseTest (many (string "a")) "aaa" @@ -60,3 +66,4 @@ main = do return as) "a,a,a," parseTest opTest "a+b+c" parseTest exprTest "1*2+3/4-5" + parseTest manySatisfyTest "ab?" diff --git a/src/Text/Parsing/Parser/String.purs b/src/Text/Parsing/Parser/String.purs index c75e511..2241f70 100644 --- a/src/Text/Parsing/Parser/String.purs +++ b/src/Text/Parsing/Parser/String.purs @@ -34,9 +34,10 @@ char = ParserT $ \s' -> _ -> { consumed: true, input: drop 1 s', result: Right (charAt 0 s') } satisfy :: forall m. (Monad m) => (String -> Boolean) -> ParserT String m String -satisfy f = do - p <- char - if f p then return p else fail "Character did not satisfy predicate" +satisfy f = try do + c <- char + if f c then return c + else fail "Character did not satisfy predicate" whiteSpace :: forall m. (Monad m) => ParserT String m String whiteSpace = do