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_collections ids event = 23 let id = Event.get_collection 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)