(* The hash table for utility locations *) module M = Map.Make (String) type entry = { hits : int; loc : string } type t = entry M.t let empty = M.empty let add ~utility ~loc t = match M.find_opt utility t with | Some { hits; loc = loc' } when String.equal loc loc' -> M.add utility { hits = hits + 1; loc } t | None | Some _ -> M.add utility { hits = 1; loc } t let lookup ~utility t = M.find_opt utility t |> Option.map (fun v -> v.loc) let pp ppf t = let entries = M.to_list t in match entries with | [] -> () | _ -> let pp_entry ppf (_, { hits; loc }) = Fmt.pf ppf "%-7i %s@." hits loc in let pp_header ppf () = Fmt.pf ppf "%-7s %s@." "hits" "command" in Fmt.pf ppf "@[%a%a@]" pp_header () Fmt.(list pp_entry) entries