From 9df1aab700ce4454c26c7d0ede5b51c0f0c96c66 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 11 Aug 2026 19:30:34 +0200 Subject: kernel: the LiturgicalDay result schema Temporal is embedded rather than flattened, so season/week/weekday have one home and cannot disagree with themselves. transferred_in/out make transfers visible in the result -- an ordo must print 'transferred from the 25th', and the nothing-lost invariant reads these fields. citations exists and is empty until Plan 4; adding it later would widen a type every consumer matches on. --- lib/kernel/liturgical_day.ml | 19 +++++++++++++++++++ lib/kernel/liturgical_day.mli | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 lib/kernel/liturgical_day.ml create mode 100644 lib/kernel/liturgical_day.mli (limited to 'lib') diff --git a/lib/kernel/liturgical_day.ml b/lib/kernel/liturgical_day.ml new file mode 100644 index 0000000..65e3ba5 --- /dev/null +++ b/lib/kernel/liturgical_day.ml @@ -0,0 +1,19 @@ +open Sexplib0.Sexp_conv + +(* 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; + transferred_in : 'r Celebration.t option; + (** arrived here from an impeded day *) + transferred_out : Date.t option; + (** this day's celebration went there *) + citations : Citation.t list; (** always empty until Plan 4 *) +} +[@@deriving sexp] diff --git a/lib/kernel/liturgical_day.mli b/lib/kernel/liturgical_day.mli new file mode 100644 index 0000000..3c331c3 --- /dev/null +++ b/lib/kernel/liturgical_day.mli @@ -0,0 +1,17 @@ +(** 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; + transferred_in : 'r Celebration.t option; + (** arrived here from an impeded day *) + transferred_out : Date.t option; + (** this day's celebration went there *) + citations : Citation.t list; (** always empty until Plan 4 *) +} +[@@deriving sexp] -- cgit v1.3