My agentic slop goes here. Not intended for anyone else!
1(** Cache entry information *)
2
3type t = {
4 key : string;
5 size : int64;
6 mtime : float;
7 ttl : float option;
8 flags : Flags.t;
9}
10
11let create ~key ~size ~mtime ~ttl ~flags =
12 { key; size; mtime; ttl; flags }
13
14let key t = t.key
15let size t = t.size
16let mtime t = t.mtime
17let ttl t = t.ttl
18let flags t = t.flags
19
20let is_expired t =
21 match t.ttl with
22 | None -> false
23 | Some expiry -> Unix.time () > expiry
24
25let is_pinned t =
26 Flags.is_pinned t.flags
27
28let is_stale t =
29 Flags.is_stale t.flags
30
31let is_temporary t =
32 Flags.is_temporary t.flags
33
34let compare_by_mtime a b =
35 Float.compare a.mtime b.mtime
36
37let compare_by_size a b =
38 Int64.compare a.size b.size
39
40let pp fmt t =
41 Format.fprintf fmt "Entry{key=%s, size=%Ld, mtime=%.1f, ttl=%s, flags=%a}"
42 t.key
43 t.size
44 t.mtime
45 (match t.ttl with
46 | None -> "never"
47 | Some exp -> Printf.sprintf "%.1f" exp)
48 Flags.pp t.flags
49
50(* Jsont support *)
51
52(* Helper codec for int64 *)
53let int64_jsont =
54 let kind = "Int64" in
55 let doc = "64-bit integer as number" in
56 let dec n = Int64.of_float n in
57 let enc i = Int64.to_float i in
58 Jsont.map ~kind ~doc ~dec ~enc Jsont.number
59
60let jsont =
61 let kind = "Entry" in
62 let doc = "A cache entry" in
63 let make key size mtime ttl flags = { key; size; mtime; ttl; flags } in
64 Jsont.Object.map ~kind ~doc make
65 |> Jsont.Object.mem "key" Jsont.string ~enc:key
66 |> Jsont.Object.mem "size" int64_jsont ~enc:size
67 |> Jsont.Object.mem "mtime" Jsont.number ~enc:mtime
68 |> Jsont.Object.opt_mem "ttl" Jsont.number ~enc:ttl
69 |> Jsont.Object.mem "flags" Flags.jsont ~enc:flags
70 |> Jsont.Object.finish