Shells in OCaml
1(* The hash table for utility locations *)
2
3module M = Map.Make (String)
4
5type entry = { hits : int; loc : string }
6type t = entry M.t
7
8let empty = M.empty
9
10let add ~utility ~loc t =
11 match M.find_opt utility t with
12 | Some { hits; loc = loc' } when String.equal loc loc' ->
13 M.add utility { hits = hits + 1; loc } t
14 | None | Some _ -> M.add utility { hits = 1; loc } t
15
16let lookup ~utility t = M.find_opt utility t |> Option.map (fun v -> v.loc)
17
18let pp ppf t =
19 let entries = M.to_list t in
20 match entries with
21 | [] -> ()
22 | _ ->
23 let pp_entry ppf (_, { hits; loc }) = Fmt.pf ppf "%-7i %s@." hits loc in
24 let pp_header ppf () = Fmt.pf ppf "%-7s %s@." "hits" "command" in
25 Fmt.pf ppf "@[<v>%a%a@]" pp_header () Fmt.(list pp_entry) entries