package visitors
An OCaml syntax extension for generating visitor classes
Install
Dune Dependency
Authors
Maintainers
Sources
archive.tar.gz
md5=80fc467552d944dcae0c5d7895cfba64
sha512=42522af2845fab409cdf0766cce83ac1345e0169248252ad74da2d72eefdb5d846dff2ece566667b9d80a8db57dabdbf333c32c50fef9c39f7837e78b3476b5b
doc/src/ppx_deriving_visitors/VisitorsString.ml.html
Source file VisitorsString.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
open String (* [prefix s1 s2] tests whether [s1] is a prefix of [s2], i.e. whether [s2] begins with [s1]. *) let prefix s1 s2 = let n1 = length s1 in n1 <= length s2 && s1 = sub s2 0 n1 (* [remainder s1 s2] assumes that [s1] is a prefix of [s2], and chops [s1] off [s2], returning the remainder. *) let remainder s1 s2 = assert (prefix s1 s2); let n1 = length s1 in let n2 = length s2 in sub s2 n1 (n2 - n1) (* [unquote alpha] removes a leading quote in the string [alpha], if there is one. *) let unquote alpha = let n = String.length alpha in if n > 0 && alpha.[0] = '\'' then String.sub alpha 1 (n-1) else alpha (* [print_longident] converts an OCaml long identifier to a string. *) let print_longident (x : Longident.t) : string = String.concat "." (Longident.flatten x) (* Suppose the function [f] is a lossy (non-injective) mapping of ['a] to [string]. Then, the function [protect f equal warn] is also a function of ['a] to [string], which behaves like [f], except it warns if [f] is applied to two values of type ['a] that have the same image of type [string]. *) (* [equal] must implement equality at type ['a]. *) (* [warn x1 x2 y] is invoked when [f] is applied at two distinct values [x1] and [x2] that have the same image [y] through [f]. Precautions are taken so that [f] is not invoked repeatedly if the same conflict is repeatedly detected. *) module H = Hashtbl let protect (f : 'a -> string) (equal : 'a -> 'a -> bool) (warn : 'a -> 'a -> string -> unit) : 'a -> string = (* A hash table memoizes the inverse of [f]. *) let table : (string, 'a list) H.t = H.create 127 in fun (x : 'a) -> let y = f x in let xs = try H.find table y with Not_found -> [] in H.add table y (x :: xs); if List.exists (equal x) xs || xs = [] then (* If the mapping of [x] to [y] is known already, or if no pre-image of [y] was previously known, then no warning is needed. *) y else (* The list [xs] is nonempty and does not contain [x], so its head [x'] is distinct from [x] and is also a pre-image of [y]. Warn. *) let x' = List.hd xs in warn x' x y; y
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>