namespace MS.Microservice.Core.Functional;
///
/// 为 提供函数式编程核心操作的扩展方法集合。
///
///
///
/// 涵盖以下操作类别:
///
/// - Map(函子 / Functor):对 Some 中的值进行变换。
/// - Bind(单子 / Monad):链接多个可能返回 None 的操作。
/// - Match:穷举式模式匹配。
/// - GetOrElse / OrElse:提取值或提供备用值。
/// - Where(Filter):按谓词过滤。
/// - ForEach:对 Some 执行副作用。
/// - AsEnumerable:将 Option 转为序列。
/// - Select / SelectMany:支持 LINQ 查询语法。
///
///
///
/// 来源:《C# 函数式编程》第 3.4 节 — 使用 Map 和 Bind 组合 Option 值。
///
///
public static class OptionExtensions
{
extension(Option opt)
{
// ── Map(函子操作)────────────────────────────────────────────────────
///
/// Map:将 Option 内部的值通过函数 变换为新类型,
/// 返回包含变换结果的 Option。
///
/// 变换后的值类型。
/// 值变换函数。
///
/// 若当前 Option 为 Some(t),则返回 Some(f(t));
/// 若为 None,则直接返回 None, 不会被执行。
///
///
///
/// Map 体现了"函子"(Functor)的核心概念:在保持容器结构不变的情况下,
/// 对容器内的值应用一个普通函数。
///
///
/// 此处使用 .NET 10 / C# 最新的 extension 语法声明扩展成员,
/// 让函数式能力直接挂载到 上。
///
///
/// 来源:《C# 函数式编程》第 3.4 节 — Map(函子操作)。
///
///
public Option Map(Func f)
=> opt.Match(
none: () => F.None,
some: t => (Option)F.Some(f(t)));
public Option> Map(Func f)
=> opt.Map(f.Curry());
// ── Bind(单子操作)───────────────────────────────────────────────────
///
/// Bind(又称 FlatMap / SelectMany):
/// 将 Option 内部的值传递给一个返回 Option 的函数 ,
/// 并将结果"展平"为单层 Option。
///
/// 结果 Option 的值类型。
/// 接收值并返回 Option 的函数(Cross-world 函数)。
///
/// 若当前 Option 为 Some(t),则返回 f(t)(可能为 Some 或 None);
/// 若为 None,则直接返回 None, 不会被执行。
///
///
///
/// Bind 体现了"单子"(Monad)的核心概念:将多个可能失败(返回 None)的操作
/// 串联在一起,只要任意一步返回 None,整条链路即短路为 None。
///
///
/// 来源:《C# 函数式编程》第 3.4 节 — Bind(单子操作)。
///
///
public Option Bind(Func> f)
=> opt.Match(
none: () => F.None,
some: f);
///
/// 异步版本的 Bind,用于在 Some 分支中继续执行异步跨世界函数。
///
public Task