import Spec.Courseware.Primitives

/-!
# Element —— 课程内容的原子单位

ADR-0005:element 实例 = 一个 kind 标签 + 符合该 kind schema 的数据。本模块把这条
编码成一个依赖结构,使"数据必须匹配其 kind"成为类型层面的事实而非运行时校验。
-/

namespace Spec.Courseware

variable (P : Primitives)

/--
element 实例(`PINNED`, ADR-0005)。

`data` 的类型 `P.ElementData kind` **由 `kind` 决定**——这意味着无法构造一个数据与
其 kind 不符的 element:schema 合规由类型系统而非 checker 保证。

ADR-0005 的 (a) 类信息(逐字稿、重点圈划等"语义性但只在某些 target 浮现"的字段)
属于具体 kind 的 schema,落在 `P.ElementData` 内,不出现在这个通用结构上;(b) 类
信息(html 交互、build/npm)按 ADR-0005 不进 element。交互教具是一种"重型 kind",
其 `ElementData` 只承载题目/配置数据,重实现在模型之外——它在此结构里与例题、定理
同构,仅 `kind` 不同。
-/
structure Element where
  /-- 该 element 的 kind。 -/
  kind : P.KindId
  /-- 符合 `kind` schema 的数据(类型随 `kind` 而变)。 -/
  data : P.ElementData kind

end Spec.Courseware
