(* 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. *) type ('s, 'r) t = { id : string; vocab : ('s, 'r) Vocab.t; year_start : int -> Date.t; temporal : Date.t -> ('s, 'r) Temporal.t; anchors : int -> (string * Date.t) list; easter : int -> Date.t; rules : ('s, 'r) Precedence.rules; season_runs : 's list; transfer_target : 'r Precedence.candidate -> Date.t -> (Date.t -> 'r Celebration.t) -> Date.t; readings : observed:'r Celebration.t -> temporal:('s, 'r) Temporal.t -> date:Date.t -> temporal_at:(Date.t -> ('s, 'r) Temporal.t) -> Mass_formulary.t option * Citation.t list; creed : temporal:('s, 'r) Temporal.t -> observed:'r Celebration.t -> date:Date.t -> bool; }