My agentic slop goes here. Not intended for anyone else!
1(** Cache entry flags management *) 2 3type flag = [ 4 | `Pinned 5 | `Stale 6 | `Temporary 7 | `Chunk 8] 9 10module FlagSet = Set.Make(struct 11 type t = flag 12 let compare = Stdlib.compare 13end) 14 15type t = FlagSet.t 16 17let empty = FlagSet.empty 18 19let of_list flags = 20 List.fold_left (fun acc f -> FlagSet.add f acc) FlagSet.empty flags 21 22let to_list t = 23 FlagSet.elements t 24 25let singleton flag = 26 FlagSet.singleton flag 27 28let add flag t = 29 FlagSet.add flag t 30 31let remove flag t = 32 FlagSet.remove flag t 33 34let mem flag t = 35 FlagSet.mem flag t 36 37let union = FlagSet.union 38 39let inter = FlagSet.inter 40 41let diff = FlagSet.diff 42 43let is_empty = FlagSet.is_empty 44 45let is_pinned t = mem `Pinned t 46 47let is_stale t = mem `Stale t 48 49let is_temporary t = mem `Temporary t 50 51let is_chunk t = mem `Chunk t 52 53let is_complete t = not (is_chunk t) 54 55let flag_to_char = function 56 | `Pinned -> 'P' 57 | `Stale -> 'S' 58 | `Temporary -> 'T' 59 | `Chunk -> 'C' 60 61let char_to_flag = function 62 | 'P' -> Some `Pinned 63 | 'S' -> Some `Stale 64 | 'T' -> Some `Temporary 65 | 'C' -> Some `Chunk 66 | _ -> None 67 68let to_string t = 69 to_list t 70 |> List.map flag_to_char 71 |> List.to_seq 72 |> String.of_seq 73 74let of_string s = 75 String.to_seq s 76 |> Seq.filter_map char_to_flag 77 |> List.of_seq 78 |> of_list 79 80let equal = FlagSet.equal 81 82let compare = FlagSet.compare 83 84let pp_flag fmt = function 85 | `Pinned -> Format.fprintf fmt "Pinned" 86 | `Stale -> Format.fprintf fmt "Stale" 87 | `Temporary -> Format.fprintf fmt "Temporary" 88 | `Chunk -> Format.fprintf fmt "Chunk" 89 90let pp fmt t = 91 let flags = to_list t in 92 match flags with 93 | [] -> Format.fprintf fmt "[]" 94 | _ -> 95 Format.fprintf fmt "[%s]" 96 (String.concat "," (List.map (function 97 | `Pinned -> "P" 98 | `Stale -> "S" 99 | `Temporary -> "T" 100 | `Chunk -> "C") flags)) 101 102(* Jsont support *) 103 104(* JSON codec for individual flags - using string representation *) 105let flag_jsont = 106 let kind = "Flag" in 107 let doc = "A cache entry flag" in 108 let dec s = 109 match s with 110 | "pinned" -> `Pinned 111 | "stale" -> `Stale 112 | "temporary" -> `Temporary 113 | "chunk" -> `Chunk 114 | _ -> Jsont.Error.msg Jsont.Meta.none "Invalid flag value" 115 in 116 let enc = function 117 | `Pinned -> "pinned" 118 | `Stale -> "stale" 119 | `Temporary -> "temporary" 120 | `Chunk -> "chunk" 121 in 122 Jsont.map ~kind ~doc ~dec ~enc Jsont.string 123 124(* JSON codec for flag set *) 125let jsont = 126 let kind = "Flags" in 127 let doc = "A set of cache entry flags" in 128 let dec lst = of_list lst in 129 let enc t = to_list t in 130 Jsont.map ~kind ~doc ~dec ~enc (Jsont.list flag_jsont)