namespace CanonSharp.Combinator.Abstractions;
/// 
/// 失败解析结果基类
/// 
/// 输入流类型
/// 解析结果类型
public abstract class FailedResult : ParseResult
{
    public override T Value => throw Exception;
    /// 
    /// 当前读取到的状态
    /// 
    public abstract IReadState State { get; }
    /// 
    /// 解析失败的消息
    /// 
    public abstract string Message { get; }
    /// 
    /// 解析失败的异常
    /// 
    public virtual ParseException Exception => new(ToString());
    /// 
    /// 转换该失败结果的类型
    /// 
    /// 转换之后的结果类型
    /// 转换之后的失败解析类型
    public abstract FailedResult Convert();
    internal override ParseResult Next(Func> nextParser,
        Func, ParseResult> continuation)
        => continuation(Convert());
    public override ParseResult Map(Func map)
        => Convert();
    public override TResult CaseOf(Func, TResult> successfulHandler,
        Func, TResult> failedHandler)
        => failedHandler(this);
    public override string ToString()
    {
        return $"Parse Failed: {Message}.";
    }
}