Command-line and Emacs Calendar Client

recurrence-id debug

Ryan Gibb 45745985 f1b1635a

Changed files
+36 -21
lib
+36 -20
lib/event.ml
···
{ collection; file; event; calendar }
let events_of_icalendar collection ~file calendar =
-
List.filter_map
-
(function
-
| `Event event -> Some { collection; file; event; calendar } | _ -> None)
-
(snd calendar)
+
let remove_dup_ids lst =
+
let rec aux acc = function
+
| [] -> acc
+
| x :: xs ->
+
if List.exists (fun r -> r.uid = x.uid) acc then aux acc xs
+
else aux (x :: acc) xs
+
in
+
aux [] lst
+
in
+
let events =
+
List.filter_map
+
(function `Event event -> Some event | _ -> None)
+
(snd calendar)
+
in
+
let events = remove_dup_ids events in
+
List.map (function event -> { collection; file; event; calendar }) events
let to_ical_event t = t.event
let to_ical_calendar t = t.calendar
···
let get_recurrence t = Option.map (fun r -> snd r) t.event.rrule
let get_collection t = t.collection
let get_file t = t.file
-
-
let get_recurrence_ids t =
-
let _, recurrence_ids =
-
match
-
List.partition (function `Event _ -> true | _ -> false) (snd t.calendar)
-
with
-
| `Event hd :: tl, _ ->
-
(hd, List.map (function `Event e -> e | _ -> assert false) tl)
-
| _ -> assert false
-
in
-
recurrence_ids
type comparator = t -> t -> int
···
in
let generator =
let ical_event = to_ical_event event in
-
let recurrence_ids = get_recurrence_ids event in
-
Fmt.pr "Event:\n%s\n" (format_event ~format:`Entries (clone_with_event event ical_event));
-
List.iter (fun e ->
-
Fmt.pr "Recurrent ID event:\n%s\n" (format_event ~format:`Entries (clone_with_event event e))) recurrence_ids;
-
recur_events ~recurrence_ids ical_event
+
(* The first event is the non recurrence-id one *)
+
let _, other_events =
+
match
+
List.partition
+
(function `Event _ -> true | _ -> false)
+
(snd event.calendar)
+
with
+
| `Event hd :: tl, _ ->
+
(hd, List.map (function `Event e -> e | _ -> assert false) tl)
+
| _ -> assert false
+
in
+
Fmt.pr "Event:\n%s\n"
+
(format_event ~format:`Entries (clone_with_event event ical_event));
+
List.iter
+
(fun e ->
+
Fmt.pr "Recurrent ID event:\n%s\n"
+
(format_event ~format:`Entries (clone_with_event event e)))
+
other_events;
+
(* Icalendar filters for equal uids *)
+
recur_events ~recurrence_ids:other_events ical_event
in
collect generator []
-1
lib/event.mli
···
val get_recurrence : t -> Icalendar.recurrence option
val get_collection : t -> Collection.t
val get_file : t -> Eio.Fs.dir_ty Eio.Path.t
-
val get_recurrence_ids : t -> Icalendar.event list
type comparator = t -> t -> int
(** Event comparator function type *)