Command-line and Emacs Calendar Client
1type filter = Event.t -> bool
2
3let text_matches pattern text =
4 let re = Re.Pcre.regexp ~flags:[ `CASELESS ] (Re.Pcre.quote pattern) in
5 Re.Pcre.pmatch ~rex:re text
6
7let summary_contains text event =
8 match Event.get_summary event with
9 | Some summary -> text_matches text summary
10 | None -> false
11
12let description_contains text event =
13 match Event.get_description event with
14 | Some desc -> text_matches text desc
15 | None -> false
16
17let location_contains text event =
18 match Event.get_location event with
19 | Some loc -> text_matches text loc
20 | None -> false
21
22let in_calendar_names ids event =
23 let id = Event.get_calendar_name event in
24 List.exists (fun col -> col = id) ids
25
26let recurring_only () event = Event.get_recurrence event <> None
27let non_recurring_only () event = Event.get_recurrence event = None
28let with_id id event = Event.get_id event = id
29let and_filter filters event = List.for_all (fun filter -> filter event) filters
30let or_filter filters event = List.exists (fun filter -> filter event) filters
31let not_filter filter event = not (filter event)
32let matches_filter event filter = filter event
33
34let take n list =
35 let rec aux n lst acc =
36 match (lst, n) with
37 | _, 0 -> List.rev acc
38 | [], _ -> List.rev acc
39 | x :: xs, n -> aux (n - 1) xs (x :: acc)
40 in
41 aux n list []
42
43let ( let* ) = Result.bind
44
45let query_without_recurrence ~fs calendar_dir ?filter
46 ?(comparator = Event.by_start) ?limit () =
47 let* events = Calendar_dir.get_events ~fs calendar_dir in
48 let filtered_events =
49 match filter with Some f -> List.filter f events | None -> events
50 in
51 let sorted_events = List.sort comparator filtered_events in
52 Ok
53 (match limit with
54 | Some n when n > 0 -> take n sorted_events
55 | _ -> sorted_events)
56
57let query ~fs calendar_dir ?filter ~from ~to_ ?(comparator = Event.by_start)
58 ?limit () =
59 let* events = Calendar_dir.get_events ~fs calendar_dir in
60 let events =
61 match filter with Some f -> List.filter f events | None -> events
62 in
63 let events =
64 List.concat_map
65 (fun event -> Event.expand_recurrences event ~from ~to_)
66 events
67 in
68 let sorted_events = List.sort comparator events in
69 Ok
70 (match limit with Some n when n > 0 -> take n events | _ -> sorted_events)