package smtml
Source file statistics.ml
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 34 35 36 37 38 39(* SPDX-License-Identifier: MIT *) (* Copyright (C) 2023-2024 formalsec *) (* Written by the Smtml programmers *) type entry = [ `Int of int | `Float of float ] module Map = Map.Make (String) type t = entry Map.t let sum_entries entry1 entry2 = match (entry1, entry2) with | `Int i1, `Int i2 -> `Int (i1 + i2) | `Float f1, `Float f2 -> `Float (f1 +. f2) | _ -> Fmt.failwith "Statistics: entry type mismatch" let merge s1 s2 = Map.merge (fun _ left right -> match (left, right) with | Some left, Some right -> Some (sum_entries left right) | (Some _ as v), None | None, (Some _ as v) -> v | None, None -> None ) s1 s2 let pp_entry fmt = function | `Int i -> Fmt.int fmt i | `Float f -> Fmt.float fmt f let pp = Fmt.vbox ~indent:1 (Fmt.parens (Fmt.iter ~sep:(fun fmt () -> Fmt.pf fmt "@\n") (fun f m -> Map.iter (fun a b -> f (a, b)) m) (Fmt.parens (Fmt.pair ~sep:Fmt.sp Fmt.string pp_entry)) ) )