diff --git a/src/stdune/interned.ml b/src/stdune/interned.ml index 94e086dc..b8f9b46e 100644 --- a/src/stdune/interned.ml +++ b/src/stdune/interned.ml @@ -99,3 +99,44 @@ module Make(R : sig module Map = Int.Map end + +module type Settings = sig + val initial_size : int + val resize_policy : resize_policy +end + +module No_interning(R : Settings)() = struct + type t = string + + let compare = String.compare + let make s = s + let to_string s = s + let get s = Some s + + module Set = struct + include String.Set + let make = of_list + let pp fmt t = Fmt.ocaml_list Format.pp_print_string fmt (to_list t) + end + module Map = String.Map + + module Table = struct + type 'a t = + { default_value: 'a + ; data: (string, 'a) Hashtbl.t + } + + let create ~default_value = + { default_value + ; data = Hashtbl.create R.initial_size + } + + let get t k = + match Hashtbl.find t.data k with + | None -> t.default_value + | Some s -> s + + let set t ~key ~data = + Hashtbl.replace t.data ~key ~data + end +end diff --git a/src/stdune/interned.mli b/src/stdune/interned.mli index 6f069042..52d74905 100644 --- a/src/stdune/interned.mli +++ b/src/stdune/interned.mli @@ -36,7 +36,11 @@ end type resize_policy = Conservative | Greedy -module Make(R : sig - val initial_size : int - val resize_policy : resize_policy - end)() : S +module type Settings = sig + val initial_size : int + val resize_policy : resize_policy +end + +module Make(R : Settings)() : S + +module No_interning(R : Settings)() : S