(* A rite's season and rank vocabulary, as a record of operations. Carries functions, so it has no sexp form. The kernel is parameterised by type variables plus this record rather than by functors (spec ยง2.3): the safety that matters -- EF code cannot name an OF season -- is the same either way, and ppx_sexp_conv derives converters for parametric types natively. *) type ('s, 'r) t = { seasons : 's list; (** canonical liturgical-year order; Validate's contiguity check reads this *) season_to_string : 's -> string; season_of_string : string -> 's option; ranks : 'r list; (** documentation order, highest first. Plan 2 uses it only for the closure check -- it is not a precedence relation until Plan 3 defines one. *) rank_to_string : 'r -> string; rank_of_string : string -> 'r option; }