module Univ = struct type t = .. let id = let id = ref 0 in fun () -> incr id ; !id module Embed (M : sig type t end) = struct type t += E of M.t let wrap m = E m let read = function E m -> Some m | _ -> None let new_property () = let id = id () in let set t v = Hashtbl.replace t id @@ wrap v in let get t = Hashtbl.find_opt t id |> Fun.flip Option.bind read in (set, get) end end