123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566open!Core_kernelopen!Async_kernelopen!Import0include(String:sigtypet=string[@@derivingsexp_of]includeComparable.Swithtypet:=twithtypecomparator_witness=String.comparator_witnessincludeHashable.Swithtypet:=tend)lettype_=Value.Type.(map_idstring)[%message"filename"]lett=type_letof_value_exn=Value.Type.of_value_exntype_letto_value=Value.Type.to_valuetype_letis_absolute=Funcall.("file-name-absolute-p"<:t@->returnbool)letextension=Funcall.("file-name-extension"<:t@->return(nil_orstring))letextension_exnt=matchextensiontwith|Somex->x|None->raise_s[%message"Filename.extension_exn"~_:(t:t)];;letnondirectory=Funcall.("file-name-nondirectory"<:t@->returnstring)letof_directory=Funcall.("directory-file-name"<:string@->returnstring)letsans_extension=Funcall.("file-name-sans-extension"<:t@->returnstring)letto_directory=Funcall.("file-name-as-directory"<:t@->returnstring)letdirectory=Funcall.("file-name-directory"<:t@->return(nil_orstring))letdirectory_exnt=matchdirectorytwith|Somet->t|None->raise_s[%message"[Filename.directory_exn] of filename that has no directory"~filename:(t:t)];;letfile_relative_name=Funcall.("file-relative-name"<:t@->t@->returnt)letmake_relativet~relative_to=file_relative_nametrelative_toletexpand_file_name=Funcall.("expand-file-name"<:t@->t@->returnt)letexpandt~in_dir=expand_file_nametin_dirlettemporary_directory_var=Var.Wrap.("temporary-file-directory"<:t)lettemporary_directory()=Current_buffer0.value_exntemporary_directory_varlettemporary_directory_for_current_buffer=letfunction_symbol=Symbol.intern"temporary-file-directory"inletfuncall=Funcall.("temporary-file-directory"<:nullary@->returnt)infun()->ifSymbol.function_is_definedfunction_symbolthenfuncall()elsetemporary_directory();;letread=letread_file_name=Funcall.("read-file-name"<:string@->returnt)infun~prompt->Value.Private.run_outside_async[%here](fun()->read_file_nameprompt);;