Derive
Generic, codegen-friendly summaries of a datatype's shape.
Each helper consumes a DataSpec (or pre-normalised meta) and
produces a pure-data record that downstream tooling — schema
validators, doc renderers, codegen, dependency analysers —
can consume without re-walking the kernel HOAS.
typeDescriptor projects an arbitrary HOAS or Val type to
{ kind; … } with a finite tag set covering primitives
(nat/bool/int/string/float/attrs/path/function/any/unit/universe),
algebraic forms (list { elem }, sum { left; right },
datatype { name; args? }), recursive sites (recursive),
and unknown fallthrough (hoas { tag }).
deriveDescriptor is the base artefact: name, constructors,
per-field records with kind / index / level / role / source /
proof / recursive-index / branch-index / dependent-type /
type-descriptor. deriveSchema projects to
JSON-Schema-flavoured { title; oneOf }. deriveDocs
re-shapes for Markdown / HTML rendering. deriveFold produces
the fold-skeleton record for code generators.
deriveDeps walks a constructor record, emitting a
{ nodes; edges } graph that records constructor descents
(recAt recursion sites), role-tagged dependency fields
(matched against a fixed role policy), and proof-bearing
fields. The output is consumable by the generic graph
renderer and by build-time dependency analysers.
deriveDeps
deriveDeps: build a node-and-edge dependency graph from a value — walks each constructor record, emitting nodes for constructors and edges for recAt recursion sites, role-tagged dependency fields, and proof-bearing fields.
deriveDeps : DataSpec -> NixVal -> { datatype, root, rootPath, indexed, index, nodes, edges }
Traversal seeds at path \"$\" and recurses into each recAt
field, accumulating constructor nodes and per-field edges.
Emitted edge kinds:
recAtfield on a constructor: edge from parent to child constructor, carryingfield,role,source, and the resolved child type.- Dependency-role field (matching the role-policy predicate): edge to a referenced datatype.
- Proof-bearing field (
proof = true): edge tagging the unresolved obligation.
The returned nodes / edges shape is consumable by the
generic graph renderer and by build-time dependency analysers.
deriveDescriptor
deriveDescriptor: produce a full structured descriptor of a datatype — name, constructors, fields with kinds/types/roles, and source provenance. The base artefact other derive* helpers consume.
deriveDescriptor : DataSpec -> { name : String; constructors : [ConstructorDescriptor]; ... }
deriveDocs
deriveDocs: produce a documentation-friendly descriptor — same name and constructors as deriveDescriptor plus a heading field for use in Markdown/HTML rendering.
deriveDocs : DataSpec -> { heading : String; name : String; constructors : [...] }
deriveFold
deriveFold: produce a fold-skeleton descriptor — { datatype; cases = [{ name; fields = [{ name; kind; type; }] }] }; consumed by code generators emitting per-datatype fold scaffolds.
deriveFold : DataSpec -> { datatype : String; cases : [Object] }
deriveSchema
deriveSchema: produce a JSON-Schema-flavoured { title, oneOf : [ConstructorSchema] } from a datatype — each constructor schema records its name, field name+kind+type, and metadata flags (target index, proof, etc.).
deriveSchema : DataSpec -> { title : String; oneOf : [Object] }
typeDescriptor
typeDescriptor: convert a kernel type (HOAS or Val) into a structured descriptor record — { kind; name?; constructors?; ... } summarising the shape; used downstream by schema, docs, and dependency derivations.
typeDescriptor : Hoas | Val | null -> { kind : String; ... }