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); } }