Shells in OCaml
at main 25 lines 769 B view raw
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