type t = | Lib | Lib_root | Libexec | Libexec_root | Bin | Sbin | Toplevel | Share | Share_root | Etc | Doc | Stublibs | Man | Misc let all = [ Lib, "lib" ; Lib_root, "lib_root" ; Libexec, "libexec" ; Libexec_root, "libexec_root" ; Bin, "bin" ; Sbin, "sbin" ; Toplevel, "toplevel" ; Share, "share" ; Share_root, "share_root" ; Etc, "etc" ; Doc, "doc" ; Stublibs, "stublibs" ; Man, "man" ; Misc, "misc" ] ;; let to_string t = List.assoc t all let rec of_string x = function | [] -> None | (s, x') :: xs -> if x' = x then Some s else of_string x xs ;; let of_string x = of_string x all