Module Beloch.Spine

Per-statement hash chain for the incremental evaluation cache.

The chain has exactly one entry per Ast.stmt (the `paper square` header, which the parser consumes without producing a statement, is folded into the chain seed instead of getting its own key). Each entry folds in every entry before it, so the key at index i is a hash of everything up to and including i. Appending a statement leaves all earlier keys unchanged (full prefix reuse); editing statement k changes k and every key after it. See Session.

val span_of_stmt : Ast.stmt -> Error.span
val normalize_ws : string -> string
val canon_stmt : string -> Ast.stmt -> string
val chain_keys : string -> Ast.program -> string list