(** Cache statistics *) type t = { total_size : int64; entry_count : int; expired_count : int; pinned_count : int; stale_count : int; temporary_count : int; } let empty = { total_size = 0L; entry_count = 0; expired_count = 0; pinned_count = 0; stale_count = 0; temporary_count = 0; } let create ~total_size ~entry_count ~expired_count ~pinned_count ~stale_count ~temporary_count = { total_size; entry_count; expired_count; pinned_count; stale_count; temporary_count } let of_entries entries = List.fold_left (fun acc entry -> let open Entry in { total_size = Int64.add acc.total_size (size entry); entry_count = acc.entry_count + 1; expired_count = acc.expired_count + (if is_expired entry then 1 else 0); pinned_count = acc.pinned_count + (if is_pinned entry then 1 else 0); stale_count = acc.stale_count + (if is_stale entry then 1 else 0); temporary_count = acc.temporary_count + (if is_temporary entry then 1 else 0); } ) empty entries let total_size t = t.total_size let entry_count t = t.entry_count let expired_count t = t.expired_count let pinned_count t = t.pinned_count let stale_count t = t.stale_count let temporary_count t = t.temporary_count let pp fmt t = Format.fprintf fmt "Stats{entries=%d, size=%Ld, expired=%d, pinned=%d, stale=%d, temporary=%d}" t.entry_count t.total_size t.expired_count t.pinned_count t.stale_count t.temporary_count (* Jsont support *) (* Helper codec for int64 *) let int64_jsont = let kind = "Int64" in let doc = "64-bit integer as number" in let dec n = Int64.of_float n in let enc i = Int64.to_float i in Jsont.map ~kind ~doc ~dec ~enc Jsont.number let jsont = let kind = "Stats" in let doc = "Cache statistics" in let make total_size entry_count expired_count pinned_count stale_count temporary_count = { total_size; entry_count; expired_count; pinned_count; stale_count; temporary_count } in Jsont.Object.map ~kind ~doc make |> Jsont.Object.mem "total_size" int64_jsont ~enc:total_size |> Jsont.Object.mem "entry_count" Jsont.int ~enc:entry_count |> Jsont.Object.mem "expired_count" Jsont.int ~enc:expired_count |> Jsont.Object.mem "pinned_count" Jsont.int ~enc:pinned_count |> Jsont.Object.mem "stale_count" Jsont.int ~enc:stale_count |> Jsont.Object.mem "temporary_count" Jsont.int ~enc:temporary_count |> Jsont.Object.finish