using GFramework.Core.Abstractions.Property;
using GFramework.Core.Abstractions.StateManagement;
using GFramework.Core.StateManagement;
namespace GFramework.Core.Extensions;
///
/// 为 Store 提供选择器和 BindableProperty 风格桥接扩展。
/// 这些扩展用于在集中式状态容器和现有 Property/UI 生态之间建立最小侵入的互操作层。
///
public static class StoreExtensions
{
///
/// 从 Store 中选择一个局部状态视图。
///
/// 源状态类型。
/// 局部状态类型。
/// 源 Store。
/// 状态选择委托。
/// 可用于订阅局部状态变化的只读绑定视图。
public static StoreSelection Select(
this IReadonlyStore store,
Func selector)
{
ArgumentNullException.ThrowIfNull(store);
ArgumentNullException.ThrowIfNull(selector);
return new StoreSelection(store, selector);
}
///
/// 从 Store 中选择一个局部状态视图,并指定局部状态比较器。
///
/// 源状态类型。
/// 局部状态类型。
/// 源 Store。
/// 状态选择委托。
/// 用于比较局部状态是否变化的比较器。
/// 可用于订阅局部状态变化的只读绑定视图。
public static StoreSelection Select(
this IReadonlyStore store,
Func selector,
IEqualityComparer? comparer)
{
ArgumentNullException.ThrowIfNull(store);
ArgumentNullException.ThrowIfNull(selector);
return new StoreSelection(store, selector, comparer);
}
///
/// 使用显式选择器对象从 Store 中选择一个局部状态视图。
///
/// 源状态类型。
/// 局部状态类型。
/// 源 Store。
/// 状态选择器实例。
/// 用于比较局部状态是否变化的比较器。
/// 可用于订阅局部状态变化的只读绑定视图。
public static StoreSelection Select(
this IReadonlyStore store,
IStateSelector selector,
IEqualityComparer? comparer = null)
{
ArgumentNullException.ThrowIfNull(store);
ArgumentNullException.ThrowIfNull(selector);
return new StoreSelection(store, selector.Select, comparer);
}
///
/// 将 Store 中选中的局部状态桥接为 IReadonlyBindableProperty 风格接口。
///
/// 源状态类型。
/// 局部状态类型。
/// 源 Store。
/// 状态选择委托。
/// 用于比较局部状态是否变化的比较器。
/// 只读绑定属性视图。
public static IReadonlyBindableProperty ToBindableProperty(
this IReadonlyStore store,
Func selector,
IEqualityComparer? comparer = null)
{
ArgumentNullException.ThrowIfNull(store);
ArgumentNullException.ThrowIfNull(selector);
return new StoreSelection(store, selector, comparer);
}
}