Here's my code:
Parser = Callable[[str, State], ParseResult[T]]
def monadic_fail(parser: Parser[T]) -> Parser[T]:
def new_parser(stream: str, state: State) -> ParseResult[T]:
if isinstance(state, ParseError):
return ParseResult(output=None, state=state)
return parser(stream, state)
return new_parser