summaryrefslogtreecommitdiff
path: root/lib/rites/rite_of/vocab_of.mli
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 15:35:59 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-25 15:35:59 +0200
commit6559a9b19451ce82a7d71281e25899acbcee2d49 (patch)
tree50474427ffa3f0403ce8f42998ec3aaf018af303 /lib/rites/rite_of/vocab_of.mli
parent73cdea4403e02e356e6eb2abaa7a96845d3b050c (diff)
downloadcolitur-6559a9b19451ce82a7d71281e25899acbcee2d49.tar.gz
colitur-6559a9b19451ce82a7d71281e25899acbcee2d49.zip
feat(of): Phase 1 of the OF rite module — vocab_of, temporal_of
The first code for a second rite. lib/rites/rite_of/vocab_of implements the OF's five-way rank vocabulary (Sollemnitas/Festum/Memoria_obligatoria/ Memoria_ad_libitum/Feria) and five-season vocabulary (Advent/Christmas/ Lent/Easter/Ordinary_time), each constructor cited against the 2002 Missale Romanum's Normae universales and the Tabula dierum liturgicorum. temporal_of implements season boundaries, week numbering — including Ordinary Time's own two-block resumption, derived from the Missale's own "HEBDOMADA I/XXXIV 'per annum'" headings and empirically verified across the whole 1583-9999 domain — named temporal days, and Sunday/ferial slugs. Both satisfy Colitur_kernel.Temporal.RITE with no kernel change. No Rite.t is assembled and no CLI wiring is added (Phase 2's own scope); lib/rites/rite_ef and data/ef are untouched, verified byte-identical against the v1.0.0 tag across a domain-spanning sample. test/test_temporal_of.ml adds unit tests for every boundary and named day plus seven QCheck properties (seasons contiguous, Ordinary Time weeks in 1..34, Advent always four Sundays, slug uniqueness, weekday agreement, determinism, consecutive liturgical years partition civil time), with a committed exhaustive sweep mirroring test_validate.ml's own convention. Full account, including the Ordinary Time derivation's evidence and a list of EF concepts that do not carry over, in .superpowers/sdd/of-phase1-report.md (untracked, gitignored).
Diffstat (limited to 'lib/rites/rite_of/vocab_of.mli')
-rw-r--r--lib/rites/rite_of/vocab_of.mli58
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/rites/rite_of/vocab_of.mli b/lib/rites/rite_of/vocab_of.mli
new file mode 100644
index 0000000..dd23cfa
--- /dev/null
+++ b/lib/rites/rite_of/vocab_of.mli
@@ -0,0 +1,58 @@
+(** OF (post-1970) season and rank vocabulary. *)
+
+type season =
+ | Advent
+ | Christmas
+ | Lent
+ | Easter
+ | Ordinary_time
+[@@deriving sexp]
+
+(** Normae universales de anno liturgico et de calendario (Missale Romanum
+ editio typica tertia, 2002), Titulus I ("De diebus liturgicis"), and the
+ Institutio Generalis Missalis Romani (IGMR) n. 346's own colour-rule
+ prose, both cite the four graded celebrations by these exact names: a
+ Sunday-or-weekday MYSTERY of the Lord that ranks above everything else
+ ([Sollemnitas]), a lesser but still universally-binding celebration
+ ([Festum]), a saint's day the calendar obliges everyone to keep
+ ([Memoria_obligatoria]), and one a community may keep or not
+ ([Memoria_ad_libitum]).
+
+ A FIFTH constructor, [Feria], is added beyond those four -- not a fifth
+ grade on the same scale, but a different kind of thing: an ordinary
+ weekday carries none of the four (Normae Titulus I.IV n. 16 calls these
+ days "feriae", never a "celebratio" of any grade), yet
+ {!Colitur_kernel.Celebration.t} requires a [rank] on every day the way
+ {!Colitur_kernel.Vocab_ef}'s own catch-all [Class4] does for EF. Ferias
+ are graded for PRECEDENCE (privileged Lenten/Advent ferias outrank an
+ ordinary one, per the Tabula dierum liturgicorum's own entries 2, 9 and
+ 13) but that grading is a {!Colitur_kernel.Precedence.rules.band} table
+ lookup (Phase 2), not a distinct [rank] value -- unlike EF, where
+ [Class2]/[Class3]/[Class4] carry a privileged feria's own grade directly.
+ See vocab_of.ml's own top-of-file comment for the primary-source
+ citations and the design decision this rests on. *)
+type rank =
+ | Sollemnitas
+ | Festum
+ | Memoria_obligatoria
+ | Memoria_ad_libitum
+ | Feria
+[@@deriving sexp]
+
+val seasons : season list
+val ranks : rank list
+val season_to_string : season -> string
+val season_of_string : string -> season option
+
+(** The word used when building a slug: lowercase, hyphenated, e.g.
+ ["ordinary-time"] for [Ordinary_time]. Unlike {!Colitur_kernel.Vocab_ef
+ .season_slug_word}, this is not adopted from any external lectionary --
+ OF has no bootstrapped-from-lectio slug legacy to preserve -- so it is
+ simply {!season_to_string}'s own hyphenated image; kept as a separate
+ function anyway so a future divergence (a real lectionary source using
+ different words) does not require renaming every call site. *)
+val season_slug_word : season -> string
+
+val rank_to_string : rank -> string
+val rank_of_string : string -> rank option
+val vocab : (season, rank) Colitur_kernel.Vocab.t