using CanonSharp.Combinator.Abstractions;
namespace CanonSharp.Combinator.Parsers.Bases;
///
/// 下一步解析器
///
/// 上游解析器
/// 成功情况下的解析器函数
/// 失败情况下的解析器函数
/// 输入流类型
/// 上游解析器结果类型
/// 最终解析结果类型
internal sealed class NextParser(
IParser parser,
Func> successfulParser,
Func, IParser> failedParser) : IParser
{
public IParseResult Run(TState state,
Func, IParseResult> continuation)
where TState : IReadState
{
return parser.Run(state, result => result.CaseOf(
successfulResult => successfulResult.Next(successfulParser, continuation),
failedResult => failedParser(failedResult).Run(state, continuation)));
}
}