aboutsummaryrefslogtreecommitdiff
path: root/lib/rites/rite_ef/rite_ef.ml
blob: a8a9703885d6ff4c79095648db0683da3ccf53ed (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
(* This module's name matches the library's own name ("rite_ef"), 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_ef.Temporal_ef] (bin/main.ml, every test/ file that opens this
   rite) stop resolving. *)
module Vocab_ef = Vocab_ef
module Temporal_ef = Temporal_ef
module Precedence_ef = Precedence_ef
module Lectionary_ef = Lectionary_ef

open Colitur_kernel

(* [~lectionary] and [~commons], not values closed over an internal load:
   fix round 1 (coordinator review) found the previous version -- [context]
   as a plain value, [Lectionary_ef] loading data/ef/lectionary.sexp as a
   side effect of being linked -- made `colitur easter <year>` (no
   lectionary data touched at all) die at startup the moment that file was
   absent from a bare `dune build`'s own default target. A function mirrors
   how the sanctoral [Layer.t] already travels: caller-supplied, not
   embedded (see this module's own .mli doc comment on [context] for the
   fuller rationale, shared with data/ef/sanctoral.sexp).

   [~commons] is REQUIRED, not optional-with-a-default: an omitted
   [?commons] would silently give a caller [Commons.empty], i.e. a rite
   whose class-3 saints quietly lose their Mass, and nothing in the suite
   compares citations across layers 3-5, so that loss would be invisible.
   A caller that genuinely has no Commons data passes
   [Lectionary_ef.Commons.empty] and says so. *)
let context ~lectionary ~commons : (Vocab_ef.season, Vocab_ef.rank) Rite.t =
  { Rite.id = Temporal_ef.id;
    vocab = Vocab_ef.vocab;
    year_start = Temporal_ef.year_start;
    temporal = Temporal_ef.temporal;
    anchors = Temporal_ef.anchors;
    (* RG's own computus: the Roman rite reckons Easter on the Gregorian
       calendar. Supplied here rather than assumed by the kernel, so a
       Julian-reckoning rite can supply {!Computus.julian_easter}
       instead. Read by [Layer.index] for [Date_spec.Easter_offset]. *)
    easter = Colitur_kernel.Computus.gregorian_easter;
    rules =
      { Precedence.band = Precedence_ef.band;
        disposition = Precedence_ef.disposition;
        admit = Precedence_ef.admit };
    season_runs = Vocab_ef.seasons;
    transfer_target = Precedence_ef.transfer_target;
    readings = Lectionary_ef.readings ~lectionary ~commons }