namespace GFramework.Core.Abstractions.StateManagement;
///
/// 可写状态容器接口,提供统一的状态分发入口。
/// 所有状态变更都应通过分发 action 触发,以保持单向数据流和可测试性。
///
/// 状态树的根状态类型。
public interface IStore : IReadonlyStore
{
///
/// 获取当前是否可以撤销到更早的历史状态。
/// 当未启用历史缓冲区,或当前已经位于最早历史点时,返回 。
///
bool CanUndo { get; }
///
/// 获取当前是否可以重做到更晚的历史状态。
/// 当未启用历史缓冲区,或当前已经位于最新历史点时,返回 。
///
bool CanRedo { get; }
///
/// 分发一个 action 以触发状态演进。
/// Store 会按注册顺序执行与该 action 类型匹配的 reducer,并在状态变化后通知订阅者。
///
/// action 的具体类型。
/// 要分发的 action 实例。
void Dispatch(TAction action);
///
/// 将多个状态操作合并到一个批处理中执行。
/// 批处理内部的每次分发仍会立即更新 Store 状态和历史,但订阅通知会延迟到最外层批处理结束后再统一触发一次。
///
/// 批处理主体;调用方应在其中执行若干次 、 或 。
void RunInBatch(Action batchAction);
///
/// 将当前状态回退到上一个历史点。
///
/// 当历史缓冲区未启用,或当前已经没有可撤销的历史点时抛出。
void Undo();
///
/// 将当前状态前进到下一个历史点。
///
/// 当历史缓冲区未启用,或当前已经没有可重做的历史点时抛出。
void Redo();
///
/// 跳转到指定索引的历史点。
/// 该能力适合调试面板或开发工具实现时间旅行查看。
///
/// 目标历史索引,从 0 开始。
/// 当历史缓冲区未启用时抛出。
/// 当 超出当前历史范围时抛出。
void TimeTravelTo(int historyIndex);
///
/// 清空当前撤销/重做历史,并以当前状态作为新的历史锚点。
/// 该操作不会修改当前状态,也不会触发额外通知。
///
void ClearHistory();
}