aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/rites/rite_ef/lectionary_ef.ml57
-rw-r--r--lib/rites/rite_ef/lectionary_ef.mli10
-rw-r--r--lib/rites/rite_ef/rite_ef.mli5
3 files changed, 64 insertions, 8 deletions
diff --git a/lib/rites/rite_ef/lectionary_ef.ml b/lib/rites/rite_ef/lectionary_ef.ml
index ec1aa0a..02c3c64 100644
--- a/lib/rites/rite_ef/lectionary_ef.ml
+++ b/lib/rites/rite_ef/lectionary_ef.ml
@@ -2,6 +2,10 @@ open Colitur_kernel
(* Step 1: the observed celebration's own proper.
Step 2: the day's own temporal slug.
+ Step 3: a weekday whose own slug has no entry says the preceding Sunday's
+ Mass -- see the implementation comment on that branch in [readings] for
+ the termination argument and why it is the Sunday's TEMPORAL, not
+ observed, identity.
Nothing here encodes "Lent has daily propers": the presence of an entry in
[lectionary] is the sole discriminator -- this function does not branch on
@@ -17,10 +21,59 @@ open Colitur_kernel
ferial-Mass rubrics when coding") -- that confirmation has not been done;
do not read this comment as citing RG/the Missal for the SELECTION rule
itself, only [Lectionary.find]'s presence-or-absence as the mechanism. *)
-let readings ~lectionary ~observed ~temporal ~date:_ ~temporal_at:_ =
+(* Days from a given weekday back to the preceding Sunday. Sunday itself
+ yields 0, which is why step 3 must guard on it -- see [readings] below. *)
+let days_since_sunday : Date.weekday -> int = function
+ | Date.Sun -> 0
+ | Date.Mon -> 1
+ | Date.Tue -> 2
+ | Date.Wed -> 3
+ | Date.Thu -> 4
+ | Date.Fri -> 5
+ | Date.Sat -> 6
+
+let readings ~lectionary ~observed ~temporal ~date ~temporal_at =
match observed.Celebration.citations with
| _ :: _ as cs -> cs
| [] -> (
match Lectionary.find lectionary temporal.Temporal.office.Celebration.slug with
| Some cs -> cs
- | None -> [])
+ | None -> (
+ (* Step 3: a feria with no proper of its own says the preceding
+ Sunday's Mass. WARRANT is the same as step 2's -- lectio's own
+ observed behaviour, not a confirmed Missal citation: this is the
+ rule lectio hard-codes as data on the four Advent ferias
+ (Advent II's readings copied verbatim onto the following
+ Monday-Saturday) and leaves absent on the other slugs this step
+ now also reaches; docs/research/rules-register.md already
+ records the ferial-Mass selection rule itself as unconfirmed
+ against the primary source.
+
+ Termination: guarded on weekday. A Sunday reaching this branch
+ would compute [days_since_sunday Sun = 0] and look up ITSELF,
+ looping forever -- every other step in the chain consults data
+ (a lectionary lookup), this is the only one that consults
+ another date, so this guard is the whole chain's termination
+ argument, not merely a special case.
+
+ The preceding Sunday's TEMPORAL slug, never its observed one:
+ the rubric is the preceding Sunday's Mass even in a year when a
+ feast displaced that Sunday from being observed (see
+ test_step3_uses_temporal_not_observed). [temporal_at] gives the
+ temporal identity of any date, so the Sunday is reached by date
+ arithmetic and a fresh call to the temporal cycle -- never by
+ string surgery on [own_slug]: the slug shapes are genuinely
+ inconsistent across seasons (e.g. [ef-advent-sunday-1] versus
+ [ef-advent-1-monday], the week number on opposite sides of the
+ season name), so deriving one from the other textually would be
+ a latent bug the moment a season's naming convention differs. *)
+ let offset = days_since_sunday temporal.Temporal.weekday in
+ if offset = 0 then []
+ else
+ let sunday = Date.add_days date (-offset) in
+ let sunday_temporal = temporal_at sunday in
+ match
+ Lectionary.find lectionary sunday_temporal.Temporal.office.Celebration.slug
+ with
+ | Some cs -> cs
+ | None -> []))
diff --git a/lib/rites/rite_ef/lectionary_ef.mli b/lib/rites/rite_ef/lectionary_ef.mli
index 65fbfe5..159fd57 100644
--- a/lib/rites/rite_ef/lectionary_ef.mli
+++ b/lib/rites/rite_ef/lectionary_ef.mli
@@ -20,10 +20,12 @@ open Colitur_kernel
masking the gap in every test run). See the task report for the
reproduction.
- Steps 1 and 2 only (Task 4): the observed celebration's own proper, else
- the day's own temporal slug in the lectionary. A day matching neither
- gets [] for now -- the ferial fallback to the preceding Sunday (Task 5)
- and the Commons (Task 6) are not built here. *)
+ Steps 1-3 (Tasks 4-5): the observed celebration's own proper, else the
+ day's own temporal slug in the lectionary, else -- for a weekday whose
+ own slug has no entry -- the preceding Sunday's temporal slug (never its
+ observed one; a Sunday guards against consulting itself and looping,
+ see [readings]'s own implementation comment). A day matching none of the
+ three gets [] for now -- the Commons (Task 6) are not built here. *)
val readings :
lectionary:Lectionary.t ->
observed:Vocab_ef.rank Celebration.t ->
diff --git a/lib/rites/rite_ef/rite_ef.mli b/lib/rites/rite_ef/rite_ef.mli
index 1a4c715..12f5609 100644
--- a/lib/rites/rite_ef/rite_ef.mli
+++ b/lib/rites/rite_ef/rite_ef.mli
@@ -27,8 +27,9 @@ module Lectionary_ef = Lectionary_ef
argument {!Colitur_kernel.Rite.t.transfer_target}'s contract requires).
- [readings]: {!Lectionary_ef.readings} partially applied to the caller's
own [~lectionary] -- the observed celebration's own proper, else the
- day's own temporal slug in data/ef/lectionary.sexp (chain steps 1-2;
- the ferial fallback and the Commons are later work).
+ day's own temporal slug, else (a weekday with no entry of its own) the
+ preceding Sunday's temporal slug, in data/ef/lectionary.sexp (chain
+ steps 1-3; the Commons are later work).
Deliberately carries no [sanctoral]/[lectionary] fields the way the
original design-doc sketch of [RITE] does: {!Colitur_kernel.Rite.t} (the