Files
Workspace/Assets/Modules/ShrinkContext.Core

ShrinkContext.Core

《Cordis: A Programming Paradigm for Spatiotemporal Composability》核心机制的 Unity/C# 原型(改造方案见仓库根 CORDIS_MIGRATION.md 的阶段 0 产物)。

定位

时空可组合性的元框架核心库:不规定任何领域,只提供动态组合的两个通用原语——

  • 可逆效应(时间可组合性,论文 3.1 / 算法 1):ctx.Effect / EffectAsync,前向执行时产出逆操作,运行时按 LIFO 累积,卸载即回滚;
  • 响应式余效应(空间可组合性,论文 3.2 / 算法 2、3):ctx.Set / Get,依赖键的安装/撤回自动通知依赖者,组件在依赖全部可用时激活、失效时停用、换提供者时重载;
  • 纤程生命周期(论文 4 / 算法 4、5):runtime.Use(component) 实例化组件为纤程,惯性状态机 Loading → Active → Unloading → Inactive,卸载先等待依赖者排空再回滚自身效应,父卸载级联子卸载。

目录结构

目录 说明
Runtime/Context/ ShrinkCtx(一等上下文、隔离派生、介导访问)与 ShrinkEffectHandle(算法 1
Runtime/Coeffects/ 绑定与异常类型(供给冲突、未声明/未激活访问)
Runtime/Fibers/ IShrinkComponentinject/provide/apply)、ShrinkFiber、分步效应接口
Runtime/Loader/ 声明式加载器(论文 5.2 原型子集):ShrinkLoaderEntry / ShrinkComponentCatalog / ShrinkContextLoader 增量协调
Runtime/ ShrinkContextRuntime(注册表 + 算法 2-5)、ShrinkContextDefaultsDomain Reload 重置)
Tests/ EditMode 测试:对照论文定理 7/16/20/63/64 与算法 1/2/3/4/5/6 的可观察行为 + 加载器协调行为

论文 → API 对照

论文概念 本实现
ctx.effect(callback) → dispose ShrinkCtx.Effect / EffectAsyncShrinkEffectHandle.DisposeAsync(armed 单次执行,等待进行中前向)
ctx.get/set(算法 2 ShrinkCtx.Set<T>(可逆,安装+通知 / 撤回+通知)
ctx.isolate(key, realm) ShrinkCtx.Isolate(派生子上下文,丢弃即恢复)
代理介导访问(算法 6 ShrinkCtx.Get<T>/TryGet(沿纤程链解析已提交视图;未声明/未激活访问抛异常)
ctx.use(component)(算法 4 ShrinkContextRuntime.Use(实例化是父上下文的可逆效应 → 级联卸载;支持条目级 isolate 叠加)
声明式配置 + 协调(论文 5.2 ShrinkContextLoader.ApplyAsync(条目消失→退役;disabled→卸载;组件/配置变化→重建;无变化→幂等;依赖缺失→条目保持被管理并等待)
refresh/reload/unload(算法 5 RunTransitionAsync(惯性链式转换;卸载先 drain 依赖者)
notify(算法 3 ShrinkContextRuntime.Notifyrealm 一致的依赖者刷新)
target = 提供者 uid 集合 ShrinkFiber.Target(uid 永不复用:同值不同提供者也触发重载)
𝔈iterΓ 分步效应 IShrinkIterativeComponent.ApplySteps(自定义 UniTask 步进器,步进边界守卫 → 部分回滚;不用 IAsyncEnumerable,规避 Mono ValueTask 迭代器的非内联调度)
fiber.committed 提交视图 ShrinkFiber.Committed(装载前提交,拆除完才丢弃)

测试覆盖(对照论文元理论)

  • 定理 7(恢复初始上下文)/ 定理 16(LIFO)/ 选择性撤销 / armed 幂等 / dispose 等待进行中前向
  • set 可逆性、介导访问纪律(UNDECLARED / INACTIVE)、隔离域派生与丢弃恢复
  • 依赖驱动激活、缺依赖静默非活动、晚到提供者激活
  • 退役次序:依赖者先于提供者逆操作排空(drain-before-inverse
  • 提供者替换重载(含同值替换,uid 语义)
  • 父子级联、供给冲突、循环依赖静止(论文 6.5)
  • 惯性:装载中途退役永不 Active、链式卸载(论文 4.3.3
  • 分步效应部分回滚(定理 64
  • apply 失败的部分效应回滚(L-Raise)
  • Domain Reload 重置

明确不在本原型内(后续阶段)

  • 声明式配置树加载器与增量协调(阶段 2)
  • 热模块替换 / ModFramework 合流(阶段 4,受 Unity 程序集不可卸载约束,回滚单位是纤程实例)
  • 拦截(intercept)与细粒度访问控制(阶段 5)
  • 主线程泵与 MonoBehaviour 宿主、notify 的 key→fibers 倒排索引(性能)
  • 跨进程/独立服务器上下文

约定

  • 仅主线程使用;异步转换在同步可完成路径上内联跑完(测试无需 PlayerLoop 泵即可确定性断言)。
  • 测试中的 TestAwait.Run 同步阻塞等待,仅用于保证延续同步完成的测试代码。