// Copyright (c) 2025 GeWuYou
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using GFramework.Core.functional.types;
namespace GFramework.Core.functional.control;
///
/// 控制流扩展方法类,提供函数式编程风格的控制结构
///
public static class ControlExtensions
{
///
/// Match:模式匹配(类似switch表达式)
///
/// 输入值的类型
/// 匹配结果的类型
/// 要进行模式匹配的输入值
/// 匹配案例数组,每个包含谓词和处理器
/// 匹配到的处理结果
/// 当没有匹配的案例时抛出
public static Option Match(
this TSource value,
params (Func predicate, Func handler)[] cases)
{
foreach (var (predicate, handler) in cases)
{
if (predicate(value))
return Option.Some(handler(value));
}
return Option.None();
}
///
/// MatchOrDefault:带默认值的模式匹配
///
/// 输入值的类型
/// 匹配结果的类型
/// 要进行模式匹配的输入值
/// 当没有匹配案例时的默认返回值
/// 匹配案例数组,每个包含谓词和处理器
/// 匹配到的处理结果或默认值
public static TResult MatchOrDefault(
this TSource value,
TResult defaultValue,
params (Func predicate, Func handler)[] cases)
{
foreach (var (predicate, handler) in cases)
{
if (predicate(value))
return handler(value);
}
return defaultValue;
}
///
/// If:条件执行
///
/// 输入值的类型
/// 要进行条件判断的输入值
/// 条件判断函数
/// 条件为真时执行的转换函数
/// 条件为真时返回转换后的值,否则返回原值
public static TSource If(
this TSource value,
Func predicate,
Func thenFunc)
=> predicate(value) ? thenFunc(value) : value;
///
/// IfElse:条件分支
///
/// 输入值的类型
/// 要进行条件判断的输入值
/// 条件判断函数
/// 条件为真时执行的转换函数
/// 条件为假时执行的转换函数
/// 根据条件返回相应的转换结果
public static TSource IfElse(
this TSource value,
Func predicate,
Func thenFunc,
Func elseFunc)
=> predicate(value) ? thenFunc(value) : elseFunc(value);
///
/// TakeIf:条件返回值或null
///
/// 输入值的类型
/// 要进行条件判断的输入值
/// 条件判断函数
/// 条件为真时返回原值,否则返回null
public static TSource? TakeIf(
this TSource value,
Func predicate)
where TSource : class
=> predicate(value) ? value : null;
///
/// TakeUnless:条件相反的TakeIf
///
/// 输入值的类型
/// 要进行条件判断的输入值
/// 条件判断函数
/// 条件为假时返回原值,否则返回null
public static TSource? TakeUnless(
this TSource value,
Func predicate)
where TSource : class
=> !predicate(value) ? value : null;
}