package merlin-lib
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=60a630f59203a9ce7047a5f04d0f239945960dac6f38102922e328b6d2657384
sha512=19f8ec152356873e29c05b971a529146bb7079929037c2b35a5c0afb0b3adf662341ee8527282c5fdd16de391d01c2c469fc8629af9e0ae443fa9f42472b70bb
doc/merlin-lib.utils/Merlin_utils/Misc/index.html
Module Merlin_utils.Misc
Source
Miscellaneous useful types and functions
val try_finally :
?always:(unit -> unit) ->
?exceptionally:(unit -> unit) ->
(unit -> 'a) ->
'a
try_finally work ~always ~exceptionally
is designed to run code in work
that may fail with an exception, and has two kind of cleanup routines: always
, that must be run after any execution of the function (typically, freeing system resources), and exceptionally
, that should be run only if work
or always
failed with an exception (typically, undoing user-visible state changes that would only make sense if the function completes correctly). For example:
let objfile = outputprefix ^ ".cmo" in
let oc = open_out_bin objfile in
Misc.try_finally
(fun () ->
bytecode
++ Timings.(accumulate_time (Generate sourcefile))
(Emitcode.to_file oc modulename objfile);
Warnings.check_fatal ())
~always:(fun () -> close_out oc)
~exceptionally:(fun _exn -> remove_file objfile);
If exceptionally
fail with an exception, it is propagated as usual.
If always
or exceptionally
use exceptions internally for control-flow but do not raise, then try_finally
is careful to preserve any exception backtrace coming from work
or always
for easier debugging.
reraise_preserving_backtrace e f
is (f (); raise e) except that the current backtrace is preserved, even if f
uses exceptions internally.
protect_refs l f
temporarily sets r
to v
for each R (r, v)
in l
while executing f
. The previous contents of the references is restored even if f
raises an exception.
val output_to_file_via_temporary :
?mode:open_flag list ->
string ->
(string -> out_channel -> 'a) ->
'a
edit_distance a b cutoff
computes the edit distance between strings a
and b
. To help efficiency, it uses a cutoff: if the distance d
is smaller than cutoff
, it returns Some d
, else None
.
The distance algorithm currently used is Damerau-Levenshtein: it computes the number of insertion, deletion, substitution of letters, or swapping of adjacent letters to go from one word to the other. The particular algorithm may change in the future.
spellcheck env name
takes a list of names env
that exist in the current environment and an erroneous name
, and returns a list of suggestions taken from env
, that are close enough to name
that it may be a typo for one of them.
did_you_mean ppf get_choices
hints that the user may have meant one of the option returned by calling get_choices
. It does nothing if the returned list is empty.
The unit -> ...
thunking is meant to delay any potentially-slow computation (typically computing edit-distance with many things from the current environment) to when the hint message is to be printed. You should print an understandable error message before calling did_you_mean
, so that users get a clear notification of the failure even if producing the hint is slow.
String.cut_at s c
returns a pair containing the sub-string before the first occurrence of c
in s
, and the sub-string after the first occurrence of c
in s
. let (before, after) = String.cut_at s c in before ^ String.make 1 c ^ after
is the identity if s
contains c
.
Raise Not_found
if the character does not appear in the string
Returns a more precise measurement of resources usage than Sys.times/Unix.times. Both user and kernel cpu time is accounted.
normalise_eol s
returns a fresh copy of s
with any '\r' characters removed. Intended for pre-processing text which will subsequently be printed on a channel which performs EOL transformations (i.e. Windows)
Return the name of the OCaml module matching a basename (filename without directory). Remove the extension and capitalize
ordinal_suffix n
is the appropriate suffix to append to the numeral n
as an ordinal number: 1
-> "st"
, 2
-> "nd"
, 3
-> "rd"
, 4
-> "th"
, and so on. Handles larger numbers (e.g., 42
-> "nd"
) and the numbers 11--13 (which all get "th"
) correctly.