#nullable enable
using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
namespace ShrinkContext
{
///
/// 组件 = (inject 依赖键集合 d, provide 供给键集合 p, apply 效应函数 e)(论文定义 43)。
/// apply 内部通过 ctx.Set 提供依赖、ctx.Get 消费依赖、ctx.Effect 注册可逆效应;
/// 组件的拆卸由运行时按已追踪的逆操作自动推导,无需手写卸载路径。
///
public interface IShrinkComponent
{
string Name { get; }
/// 声明的依赖键集合(论文 d):全部可用时组件才激活。
IReadOnlyList Inject { get; }
/// 供给键集合(论文 p):apply 的效应不应写入 p 之外的键。
IReadOnlyList Provide { get; }
/// 效应函数(论文 e):激活时执行;其中注册的效应在停用时按 LIFO 回滚。
UniTask ApplyAsync(ShrinkCtx ctx, object? config);
}
///
/// 分步效应组件(论文 𝔈iterΓ):apply 以步进器逐步产出逆操作。
/// 目标在步进边界发生变化时中断迭代并回滚已执行步骤(部分回滚,论文 4.3.2 / 定理 64)。
/// 使用自定义 UniTask 步进协议而非 IAsyncEnumerable:
/// Mono 的 ValueTask 迭代器恢复经同步上下文调度,会破坏同步内联的确定性语义。
///
public interface IShrinkIterativeComponent : IShrinkComponent
{
IShrinkStepEffectEnumerator ApplySteps(ShrinkCtx ctx, object? config);
}
/// 分步效应步进器:MoveNextAsync 执行该步前向并使 Current 指向其逆操作。
public interface IShrinkStepEffectEnumerator
{
/// 推进到下一步;返回 false 表示迭代结束。前向在该调用内执行完毕。
UniTask MoveNextAsync();
/// 最近一次 MoveNextAsync 成功后该步的逆操作。
Func Current { get; }
}
}