using CanonSharp.Combinator.Abstractions;
namespace CanonSharp.Combinator.Parsers.Bases;
///
/// 恢复解析器
/// 在上游解析器失败的情况下调用指定恢复函数返回的解析器
///
/// 上游解析器
/// 返回新解析器的恢复函数
/// 输入令牌类型
/// 解析结果类型
internal sealed class ResumeParser(
IParser parser,
Func, IParser> failedHandler) : IParser
{
public IParseResult Run(TState state,
Func, IParseResult> continuation)
where TState : IReadState
{
return parser.Run(state,
result => result.CaseOf(continuation,
failedResult => failedHandler(failedResult).Run(state, continuation)));
}
}