summaryrefslogtreecommitdiff
path: root/lib/rites/rite_of/rite_of.ml
blob: f45bf50ae23bde48616ec76765a0753adf4ab9b7 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
(* This module's name matches the library's own name ("rite_of"), so dune
   treats it as the library's top-level module instead of generating one
   automatically -- every sibling module this library defines must be
   re-exported here explicitly, or external references to e.g.
   [Rite_of.Temporal_of] (bin/main.ml, every test/ file that opens this
   rite) stop resolving. Same property {!Rite_ef.Rite_ef}'s own top-of-file
   comment records for the EF side. *)
module Vocab_of = Vocab_of
module Temporal_of = Temporal_of
module Precedence_of = Precedence_of
module Rubrics_of = Rubrics_of
module Lectionary_of = Lectionary_of

open Colitur_kernel

(* [~lectionary], not a value closed over an internal load: {!Rite_ef.Rite_ef
   .context}'s own comment records the exact failure this shape avoids --
   fix round 1 (coordinator review) found a prior version that closed over
   [Lectionary_ef] loading data/ef/lectionary.sexp as a side effect of being
   linked, which made `colitur easter <year>` (a command touching no
   lectionary data at all) die at startup the moment that file was absent
   from a bare `dune build`. Do not repeat that here: [context] is a
   function, and [~lectionary] is caller-supplied, exactly mirroring how the
   sanctoral [Layer.t] itself already travels (a loose argument to
   {!Colitur_kernel.Calendar.year}/[day], never embedded in this record).

   No [~commons] parameter: unlike EF, the OF lectionary chain
   ({!Lectionary_of.readings}) has no Commons indirection to thread through
   -- see that function's own .mli citation for why (OF has no shared-
   formulary table the way EF's Commons.sexp is one). *)
let context ~lectionary : (Vocab_of.season, Vocab_of.rank) Rite.t =
  { Rite.id = Temporal_of.id;
    vocab = Vocab_of.vocab;
    year_start = Temporal_of.year_start;
    temporal = Temporal_of.temporal;
    anchors = Temporal_of.anchors;
    (* The Roman rite -- OF as much as EF -- reckons Easter on the Gregorian
       calendar; nothing in the Normae or the IGMR revisits that. Supplied
       here rather than assumed by the kernel, so a Julian-reckoning rite
       can supply {!Colitur_kernel.Computus.julian_easter} instead -- the
       exact reasoning {!Rite_ef.Rite_ef.context}'s own [easter] field
       carries, restated here because it is a per-rite decision, not one
       this module inherits from EF. Read by [Layer.index] to resolve
       {!Date_spec.Easter_offset} (the two movable universal solemnities,
       Sacred Heart and the Immaculate Heart of Mary, and any
       [--overlay]-supplied movable local feast). *)
    easter = Colitur_kernel.Computus.gregorian_easter;
    (* Identity: [Some (Date.month d, Date.day d)] for every date, unlike
       {!Rite_ef.Temporal_ef.bissextile_fixed_key}. The OF has NO bissextile
       (leap-year kalends-doubling) convention for [Layer.on_date]'s fixed
       half to correct for -- verified, not merely assumed absent: the only
       occurrence of "bissextilis" anywhere in the 2002 Missal (extracted
       docs/research/of/missale-romanum-2002.pdf, pdftotext -layout, line
       4502) marks leap years in the calendarium's own table of MOVABLE
       feasts (an Easter-date lookup table), not a rule that doubles a
       kalends position the way the 1962 Missal's February footnote does
       (LT.txt:5011-5014, {!Rite_ef.Temporal_ef.bissextile_fixed_key}'s own
       citation). A reader coming from the EF side of this codebase should
       expect [fixed_key] to carry that mechanism; the OF's own primary
       source simply has no such rule to encode, so this field is the
       [Rite.t.fixed_key] doc comment's own stated default for "a rite with
       no reason to differ". *)
    fixed_key = (fun d -> Some (Date.month d, Date.day d));
    rules =
      { Precedence.band = Precedence_of.band;
        disposition = Precedence_of.disposition;
        admit = Precedence_of.admit;
        vigil_feast = Precedence_of.vigil_feast };
    (* NOT [Vocab_of.seasons] (which lists each season once) -- this is
       exactly the case {!Colitur_kernel.Rite.t.season_runs}'s own doc
       comment and {!Colitur_kernel.Vocab.t.seasons}'s both name as their
       illustration of why [season_runs] is rite-supplied rather than
       derived: "a rite may legitimately have one season appear in two
       separate runs (the modern form's Ordinary Time does)". Confirmed
       directly in {!Temporal_of.season} (Normae n. 43-44, its own "first
       run"/"second run" comments): over one Advent-anchored liturgical
       year, Ordinary Time is interrupted by Lent+Easter, so the
       run-length-compressed sequence {!Validate}'s "seasons" check expects
       has SIX runs over five seasons, not five. *)
    season_runs = Vocab_of.[ Advent; Christmas; Ordinary_time; Lent; Easter; Ordinary_time ];
    transfer_target = Precedence_of.transfer_target;
    readings = Lectionary_of.readings ~lectionary ~year_start:Temporal_of.year_start;
    (* Two well-formed shapes, not EF's one -- OLM 1981 Praenotanda n. 66.1
       ("Quaelibet Missa tres exhibet lectiones": Sunday/solemnity Mass,
       First from the OT, Second "ex Apostolo", Gospel) against n. 69.1
       ("Quaelibet Missa duas exhibet lectiones": ferial Mass, First and
       Gospel only), both page-image verified,
       docs/research/of/olm-1981.pdf pp.32-33/"XXXII-XXXIII"; n. 84(b)/(c),
       pp.37-38/"XXXVII-XXXVIII", extends the three-reading shape to every
       solemnity of a particular calendar and confines feasts/memorials to
       two. {!Rite.t.citation_shapes}'s own doc comment has the fuller
       argument for why this is a rite-supplied field rather than a kernel
       constant. *)
    citation_shapes =
      [ [ Citation.First; Citation.Gospel ]; [ Citation.First; Citation.Second; Citation.Gospel ] ];
    creed = Rubrics_of.creed;
    gloria = Rubrics_of.gloria;
    preface = Rubrics_of.preface }