using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace PCL.Core.Utils;
///
/// 表示一个可能成功或失败的操作结果。
/// 类似于 Rust 的 Result。
///
/// 成功时返回的值类型
/// 失败时返回的错误类型
[DebuggerDisplay("{" + nameof(_DebuggerDisplay) + "}")]
public sealed class Result
{
private readonly TOk? _value;
private readonly TErr? _error;
private readonly bool _isSuccess;
private Result(TOk value)
{
_value = value;
_isSuccess = true;
}
private Result(TErr error)
{
_error = error;
_isSuccess = false;
}
///
/// 创建一个成功的结果。
///
public static Result Ok(TOk value) => new(value);
///
/// 创建一个失败的结果。
///
public static Result Err(TErr error) => new(error);
///
/// 是否为成功状态。
///
public bool IsSuccess => _isSuccess;
///
/// 是否为失败状态。
///
public bool IsFailure => !_isSuccess;
///
/// 获取成功值(仅在 IsSuccess 为 true 时有效)。
///
public TOk Value => IsSuccess ? _value! : throw new InvalidOperationException("Cannot access Value of a failed Result.");
///
/// 获取错误值(仅在 IsFailure 为 true 时有效)。
///
public TErr Error => IsFailure ? _error! : throw new InvalidOperationException("Cannot access Error of a successful Result.");
///
/// 使用模式匹配处理成功和失败情况。
///
public TR Match(Func onSuccess, Func onError)
=> IsSuccess ? onSuccess(_value!) : onError(_error!);
///
/// 如果成功,执行一个动作。
///
public void IfSuccess(Action action)
{
if (IsSuccess) action(_value!);
}
///
/// 如果失败,执行一个动作。
///
public void IfFailure(Action action)
{
if (IsFailure) action(_error!);
}
///
/// 将 Result<T, E> 转换为 Result<T2, E>,通过映射成功值。
///
public Result Map(Func mapper)
=> IsSuccess ? Result.Ok(mapper(_value!)) : Result.Err(_error!);
///
/// 将 Result<T, E> 转换为 Result<T, E2>,通过映射错误值。
///
public Result MapError(Func mapper)
=> IsSuccess ? Result.Ok(_value!) : Result.Err(mapper(_error!));
///
/// 如果成功,使用函数返回另一个 Result,实现链式调用。
/// 类似于 Rust 的 and_then。
///
public Result Bind(Func> mapper)
=> IsSuccess ? mapper(_value!) : Result.Err(_error!);
///
/// 如果失败,使用函数返回另一个 Result。
/// 类似于 Rust 的 or_else。
///
public Result BindError(Func> mapper)
=> IsFailure ? mapper(_error!) : Result.Ok(_value!);
///
/// 如果失败,提供一个默认值。
///
public TOk OrElse(TOk defaultValue) => IsSuccess ? _value! : defaultValue;
///
/// 如果失败,提供一个函数生成默认值。
///
public TOk OrElse(Func defaultValueFactory) => IsSuccess ? _value! : defaultValueFactory();
///
/// 如果失败,抛出异常。
///
public TOk Expect(string message) => IsSuccess ? _value! : throw new InvalidOperationException(message);
///
/// 如果失败,抛出指定的异常。
///
public TOk UnwrapOrThrow(Func exceptionFactory) where TException : Exception
=> IsSuccess ? _value! : throw exceptionFactory(_error!);
// 重写 ToString 用于调试
private string _DebuggerDisplay => IsSuccess ? $"Ok({_value})" : $"Err({_error})";
public override string ToString() => _DebuggerDisplay;
// 重写 Equals 和 GetHashCode 以支持比较
public override bool Equals(object? obj)
{
if (obj is not Result other) return false;
if (IsSuccess != other.IsSuccess) return false;
return IsSuccess
? EqualityComparer.Default.Equals(_value, other._value)
: EqualityComparer.Default.Equals(_error, other._error);
}
public override int GetHashCode()
{
return HashCode.Combine(IsSuccess, _value, _error);
}
}