blob: 513d497bf660bb26ca102632e8a0ac60b0830e51 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
open Sexplib0.Sexp_conv
(* Celebration names by language. An open assoc list rather than a fixed record,
so an overlay can add a language purely as data (spec §2.1). Kept sorted by
language code so sexp output is byte-stable. *)
type t = (Lang.t * string) list [@@deriving sexp]
let empty = []
let canonical t = List.sort (fun (a, _) (b, _) -> Lang.compare a b) t
let remove t lang = canonical (List.filter (fun (l, _) -> not (Lang.equal l lang)) t)
let set t lang name = canonical ((lang, name) :: remove t lang)
let of_list l = List.fold_left (fun acc (lang, name) -> set acc lang name) empty l
let find t lang = List.find_map (fun (l, n) -> if Lang.equal l lang then Some n else None) t
let rec find_first t = function
| [] -> None
| lang :: rest -> ( match find t lang with Some n -> Some n | None -> find_first t rest)
let to_list t = t
(* Wrap the derived t_of_sexp to enforce canonical sorting on load. *)
let t_of_sexp_derived = t_of_sexp
let t_of_sexp sexp = canonical (t_of_sexp_derived sexp)
|