From abade24943f2f77c058b5ff768093b8babc9a8c3 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 11 Aug 2026 11:59:43 +0200 Subject: kernel: Vocab, Celebration and Temporal parametric types Rite specificity is carried by type parameters plus a vocab record of operations rather than by functors: the same guarantee that a rite cannot name another rite's season, without threading module plumbing through every kernel module. Celebration takes only the rank parameter, since it has no season field and OCaml rejects a type variable that appears in no field. --- lib/kernel/temporal.ml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 lib/kernel/temporal.ml (limited to 'lib/kernel/temporal.ml') diff --git a/lib/kernel/temporal.ml b/lib/kernel/temporal.ml new file mode 100644 index 0000000..a34eeb0 --- /dev/null +++ b/lib/kernel/temporal.ml @@ -0,0 +1,26 @@ +open Sexplib0.Sexp_conv + +(* The temporal identity of a date: where in the liturgical year it sits, and + the temporal cycle's own office for it. *) +type ('s, 'r) t = { + season : 's; + week : int option; (** [None] for named days outside a numbered week *) + weekday : Date.weekday; + office : 'r Celebration.t; +} +[@@deriving sexp] + +module type RITE = sig + val id : string + + type season + type rank + + val vocab : (season, rank) Vocab.t + + (** First day of the liturgical year opening in civil year [y]. *) + val year_start : int -> Date.t + + (** Total over 1583..9999: every date yields exactly one temporal identity. *) + val temporal : Date.t -> (season, rank) t +end -- cgit v1.3