summaryrefslogtreecommitdiff
path: root/lib/kernel/liturgical_day.mli
blob: 643097b220194241d64213f73b3051440e71263a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(** 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;
      (** The LOW MASS admitted set (RG 111(b)/(c)/(d) -- {!Precedence.rules.admit}'s
          own wider caps). Not named [low_mass_commemorations]: this field
          predates the sung/low distinction and every existing reader
          ([emit], the differential/oracle layers, {!Record}) already reads
          it under this name, so renaming it would be a needless breaking
          change for a doc clarification alone. The SUNG-Mass equivalent
          (RG 111(a): at most one commemoration, and it must be privileged)
          is {!Precedence.sung_mass_commemorations}, a pure derivation over
          this same list -- see its own citation for why it is a function,
          not a second stored field. *)
  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;
      (** The day's reading references, resolved by the rite's own
          {!Rite.readings}. Empty for a rite whose lectionary is not built;
          for EF, exactly one [First] and one [Gospel] on every day of every
          year 1583..9999 -- asserted, not assumed, by {!Validate}'s own
          ["citations"] / ["citations-unresolved"] checks. (This said "always
          empty until Plan 4" until Task 10; the lectionary landed before
          Plan 4 did, and the comment outlived its truth.) *)
  formulary : Mass_formulary.t option;
      (** Which Mass this day says, and how that was decided -- see
          {!Mass_formulary}. [None] only for a rite with no lectionary; for
          EF it is [Some] on every day of every year 1583..9999, asserted by
          {!Validate}. *)
  creed : bool;
      (** Whether the Creed is said at this day's Mass -- {!Rite.t.creed},
          EF: RG 475-476. A decision, not an [option]: [false] for a rite
          that has not implemented the rule, same as [creed] itself. *)
  gloria : bool;
      (** Whether the Gloria in excelsis is said at this day's Mass --
          {!Rite.t.gloria}, EF: RG 431-432. Same seam as [creed] in every
          respect. *)
  preface : Preface.t option;
      (** Which preface is said at this day's Mass -- {!Rite.t.preface},
          EF: RG 482-499. Same seam as [creed]/[gloria], but [option], not
          a bare {!Preface.t}: see {!Rite.t.preface}'s own citation for why
          -- [None] both for a rite that has not implemented the rule and
          for a real day this engine resolves that has no Mass at all
          (Good Friday). *)
}
[@@deriving sexp]