aboutsummaryrefslogtreecommitdiff
path: root/lib/kernel/lectionary.ml
blob: 1da3d1eea22b525c2935e1ad2039076e2b230df4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
open Sexplib0.Sexp_conv

type entry = Slug.t * Citation.t list [@@deriving sexp]
type t = entry list [@@deriving sexp]

let empty = []

let of_entries es =
  let sorted = List.stable_sort (fun (a, _) (b, _) -> Slug.compare a b) es in
  let rec dup = function
    | (a, _) :: ((b, _) :: _ as rest) ->
        if Slug.equal a b then Some a else dup rest
    | _ -> None
  in
  match dup sorted with
  | Some s ->
      Error (Printf.sprintf "lectionary: duplicate slug %S" (Slug.to_string s))
  | None -> Ok sorted

let find t s = List.assoc_opt s t
let mem t s = List.mem_assoc s t
let entries t = t

let load path =
  match Sexplib.Sexp.load_sexp path with
  | exception Sexplib.Sexp.Parse_error e ->
      Error (Printf.sprintf "lectionary: %s: %s" path e.err_msg)
  | exception Sys_error e -> Error (Printf.sprintf "lectionary: %s" e)
  | sexp -> (
      match t_of_sexp sexp with
      | exception Sexplib0.Sexp_conv_error.Of_sexp_error (exn, _) ->
          Error (Printf.sprintf "lectionary: %s: %s" path (Printexc.to_string exn))
      | parsed -> of_entries parsed)