(** Everything a rite supplies, bundled. Passing these as loose arguments let a caller pair one rite's vocab with another's temporal; bundling makes that unrepresentable through the normal path. Carries functions, so it has no sexp form. *) type ('s, 'r) t = { id : string; vocab : ('s, 'r) Vocab.t; year_start : int -> Date.t; (** first day of the liturgical year opening in civil year y *) temporal : Date.t -> ('s, 'r) Temporal.t; anchors : int -> (string * Date.t) list; (** Easter-derived days: (expected slug, date) *) rules : ('s, 'r) Precedence.rules; season_runs : 's list; (** the expected run-length-compressed season sequence over one liturgical year. NOT necessarily [vocab.seasons]: a rite may have one season appear in two separate runs (the modern form's Ordinary Time does). *) }