open Sexplib0.Sexp_conv (* The single stable result schema (parent spec ยง2). *) type ('s, 'r) t = { date : Date.t; rite : string; temporal : ('s, 'r) Temporal.t; (** embedded, not flattened: it is already a coherent unit with its own invariants, and re-listing season/week/weekday here would create two places for them to disagree *) observed : 'r Celebration.t; commemorations : ('r Celebration.t * Precedence.privilege) list; transferred_in : 'r Celebration.t option; (** arrived here from an impeded day *) transferred_out : ('r Celebration.t * Date.t) list; (** celebrations that left this day, and where each one went. A list, not an option: RG 97-98 has coinciding I-class feasts transfer "in order" -- plural -- so a day can lose more than one. Asymmetric with [transferred_in] deliberately: a day receives at most one arrival, because RG 96 sends each departure to the next day that is not I or II class, and the first to arrive occupies it. *) omitted : ('r Celebration.t * string) list; (** with the reason, never silent -- Task 12's no-celebration-lost invariant reads this *) citations : Citation.t list; (** always empty until Plan 4 *) formulary : Mass_formulary.t option; (** which Mass the day says, and how that was decided; [None] only for a rite with no lectionary -- see {!Mass_formulary} *) creed : bool; (** whether the Creed is said at this day's Mass; see {!Rite.t.creed} *) } [@@deriving sexp]