@@ -13,6 +13,7 @@ import Control.Monad.State (State, lift, modify, runState)
1313import Data.Array (some , toUnfoldable )
1414import Data.Array as Array
1515import Data.Bifunctor (lmap , rmap )
16+ import Data.CodePoint.Unicode (isSpace )
1617import Data.CodePoint.Unicode as CodePoint.Unicode
1718import Data.Either (Either (..), either , fromLeft , hush )
1819import Data.Foldable (oneOf )
@@ -36,7 +37,7 @@ import Effect.Console (log, logShow)
3637import Effect.Unsafe (unsafePerformEffect )
3738import Node.Process (lookupEnv )
3839import Parsing (ParseError (..), ParseState (..), Parser , ParserT , Position (..), consume , fail , getParserT , initialPos , parseErrorMessage , parseErrorPosition , position , region , runParser )
39- import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optionMaybe , replicateA , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , tryRethrow , (<?>), (<??>), (<~?>))
40+ import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optionMaybe , replicateA , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , tryRethrow , withRecovery , (<?>), (<??>), (<~?>))
4041import Parsing.Combinators.Array as Combinators.Array
4142import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
4243import Parsing.Language (haskellDef , haskellStyle , javaStyle )
@@ -688,6 +689,25 @@ main = do
688689 parseErrorTestPosition (string " a\n b\n c\n " *> eof) " a\n b\n c\n d\n " (Position { index: 6 , column: 1 , line: 4 })
689690 parseErrorTestPosition (string " \t a" *> eof) " \t ab" (Position { index: 2 , column: 10 , line: 1 })
690691
692+ assertEqual' " withRecovery1"
693+ { actual: runParser " not-an-int here" do
694+ _ <- takeWhile isSpace
695+ withRecovery
696+ ( \err -> do
697+ nonint <- takeWhile (not <<< isSpace)
698+ pure $ Left
699+ { error: err
700+ , input: nonint
701+ }
702+ )
703+ (Right <$> intDecimal)
704+ , expected:
705+ Right $ Left
706+ { error: ParseError " Expected Int" (Position { index: 2 , column: 3 , line: 1 })
707+ , input: " not-an-int"
708+ } :: Either ParseError (Either { error :: ParseError , input :: String } Int )
709+ }
710+
691711 assertEqual' " skipSpaces consumes if position advancement issue #200"
692712 { actual: runParser " " do
693713 skipSpaces
0 commit comments