From 6fa6a8cb70d6eba0abed9b8277f164291dba0351 Mon Sep 17 00:00:00 2001 From: Emmanuel Coquery <emmanuel.coquery@univ-lyon1.fr> Date: Tue, 10 Sep 2024 10:30:32 +0200 Subject: [PATCH] Added interface for timetable --- Makefile | 4 ++++ dune-project | 2 +- lib/Timetable.ml | 42 ++++++++++++++++++++++++------------------ lib/Timetable.mli | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/dune | 2 +- ocaml_edt.opam | 1 + 6 files changed, 74 insertions(+), 20 deletions(-) create mode 100644 lib/Timetable.mli diff --git a/Makefile b/Makefile index 92da796..6998fe2 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,10 @@ _opam: build: _opam opam exec dune build +# continuous build +watch: _opam + opam exec -- dune build --watch + # help: shows the possible targets help: @sed -ne 's/^#\(.*\)$$/\1/p' Makefile diff --git a/dune-project b/dune-project index 64e3c95..e218c82 100644 --- a/dune-project +++ b/dune-project @@ -19,7 +19,7 @@ (name ocaml_edt) (synopsis "Generates timetables for course planification") (description "Program and library to generate a timetable for a course or a set of courses, outputs in HTML format among others") - (depends ocaml dune cmdliner calendar) + (depends ocaml dune cmdliner calendar yojson) (tags (topics "timetable"))) diff --git a/lib/Timetable.ml b/lib/Timetable.ml index 6b1e7dd..933a6a8 100644 --- a/lib/Timetable.ml +++ b/lib/Timetable.ml @@ -1,25 +1,29 @@ +(** Lexicographic order comparisons *) let lex access cmp fn v1 v2 = let v = fn v1 v2 in if v != 0 then v else cmp (access v1) (access v2) -let lex_r access cmp fn v1 v2 = - let v = cmp (access v1) (access v2) in - if v != 0 then v else fn v1 v2 +(* let lex_r access cmp fn v1 v2 = + let v = cmp (access v1) (access v2) in + if v != 0 then v else fn v1 v2 *) let eq _ _ = 0 -let rec gcd n m = if m = 0 then n else gcd m (n mod m) +(* let rec gcd n m = if m = 0 then n else gcd m (n mod m) *) type date = CalendarLib.Date.t +type heure = int -let as_iso (d : date) : string = CalendarLib.Printer.Date.sprint "%F" d +let heure (h : int) (m : int) : heure = (h * 60) + m -type 'a cell = { rowspan : int; colspan : int; content : 'a } -type 'a line = { headers : string cell list; cells : 'a cell list } +(* let as_iso (d : date) : string = CalendarLib.Printer.Date.sprint "%F" d *) -type 'a table = { - columns_headers : string cell list list; - lines : 'a line list; -} +(* type 'a cell = { rowspan : int; colspan : int; content : 'a } + type 'a line = { headers : string cell list; cells : 'a cell list } + + type 'a table = { + columns_headers : string cell list list; + lines : 'a line list; + } *) module type ResourcesT = sig type t @@ -31,11 +35,9 @@ end module Make (R : ResourcesT) = struct module D = CalendarLib.Date - type heure = int - - let heure (h : int) (m : int) : heure = (h * 60) + m - type creneau = { resources : R.t; date : date; start : heure; duration : int } + type creneaux = creneau list + type week = date * creneaux let compare = eq @@ -52,7 +54,7 @@ module Make (R : ResourcesT) = struct || inside c2.start c1.start c1.duration) let conflict c1 c2 = intersect c1 c2 && R.conflicts c1.resources c2.resources - let date = D.make + (* let date = D.make *) let week_of_date d : date = let day = D.day_of_week d in @@ -72,8 +74,7 @@ module Make (R : ResourcesT) = struct let l_s = supprime_conflits raise_exc c rest in if l_s == rest then l else l_s - let rec place (raise_exc : bool) (c : creneau) (l : creneau list) : - creneau list = + let rec place (raise_exc : bool) (c : creneau) (l : creneaux) : creneaux = match l with | [] -> [ c ] | c' :: rest when conflict c c' -> place raise_exc c rest @@ -96,4 +97,9 @@ module Make (R : ResourcesT) = struct aux l let by_week l = groupby (fun c -> week_of_date c.date) D.compare compare l + let week_start : week -> date = fst + + let to_fullcalendar (_cr : (date * creneau list) list) : Yojson.Safe.t = + (* let open Yojson.Safe in *) + `Null end diff --git a/lib/Timetable.mli b/lib/Timetable.mli new file mode 100644 index 0000000..71d813f --- /dev/null +++ b/lib/Timetable.mli @@ -0,0 +1,43 @@ +type date = CalendarLib.Date.t +type heure + +val heure : int -> int -> heure + +module type ResourcesT = sig + type t + + val conflicts : t -> t -> bool + val compare : t -> t -> int +end + +module Make (R : ResourcesT) : sig + type creneau = { resources : R.t; date : date; start : heure; duration : int } + (** Type pour représenter un créneau associé à des ressources *) + + type creneaux + (** Représente un ensemble de créneaux *) + + type week + (** Représente une semaine *) + + exception Conflit of (creneau * creneau) + (** Conflit de créneaux *) + + val place : bool -> creneau -> creneaux -> creneaux + (** [place b cr crl] ajoute le créneau [cr] à la liste des créneaux [crl] si + ce créneau rentre en conflit avec un créneau dans [crl], alors si [b] + vaut [true] une exception [Conflit] est levée. Si [b] vaut [false], alors + le nouveau créneau prend la place des créneaux avec lesquels il est en + conflit. + *) + + val by_week : creneaux -> week list + (** [by_week] prend un paquet de créneaux et construit une liste de semaines *) + + val week_start : week -> date + (** date du premier jour de la semaine *) + + val to_fullcalendar : week list -> Yojson.Safe.t + (** convertit un ensemble de semaines en structure json utilisable comme + donnée pour le composant javascript FullCalendar *) +end diff --git a/lib/dune b/lib/dune index f7645f9..7f777ba 100644 --- a/lib/dune +++ b/lib/dune @@ -1,3 +1,3 @@ (library (name ocaml_edt) - (libraries calendar)) + (libraries calendar yojson)) diff --git a/ocaml_edt.opam b/ocaml_edt.opam index a832823..f4add23 100644 --- a/ocaml_edt.opam +++ b/ocaml_edt.opam @@ -15,6 +15,7 @@ depends: [ "dune" {>= "3.16"} "cmdliner" "calendar" + "yojson" "odoc" {with-doc} ] build: [ -- GitLab