package ppx_expect_nobase
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
Cram like framework for OCaml (with stripped dependencies)
Install
dune-project
Dependency
Authors
Maintainers
Sources
ppx_expect_nobase-0.17.3.0.tbz
sha256=ff2cb97c867a4bd3a0778ff0924c1cb8a82c7c531f81f2b0aa220b7c29758e40
sha512=3eae2efe081aeed87d44d46f960a66744ed6d90c78f07ba91639ff2694aea655d4b71c5865d97dd88c1681e3752b90c06c252595f67ff135fcce87c38085b81f
doc/src/ppx_expect_nobase.wrappers/wrappers.ml.html
Source file wrappers.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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286let compare_int = Int.compare module Comparable = struct let lift cmp ~f x y = cmp (f x) (f y) (* compare [x] and [y] lexicographically using functions in the list [cmps] *) let lexicographic cmps x y = let rec loop = function | cmp :: cmps -> let res = cmp x y in if res = 0 then loop cmps else res | [] -> 0 in loop cmps ;; end module Fn = struct let id = Fun.id end module Char = struct include Char let is_whitespace = function | '\t' | '\n' | '\011' (* vertical tab *) | '\012' (* form feed *) | '\r' | ' ' -> true | _ -> false ;; let ( = ) : char -> char -> bool = equal let ( <> ) l r = not (l = r) end module List = struct include ListLabels let take_while ~f:p l = let[@tail_mod_cons] rec aux = function | x :: l when p x -> x :: aux l | _rest -> [] in aux l ;; let rec drop_while ~f:p = function | x :: l when p x -> drop_while ~f:p l | rest -> rest ;; let is_empty = function | [] -> true | _ -> false ;; let min_elt ~compare = function | [] -> None | h :: tl -> Some (fold_left ~f:(fun acc x -> match compare acc x with | -1 | 0 -> acc | _ -> x) ~init:h tl) ;; let fold_map t ~init ~f = let acc = ref init in let result = map t ~f:(fun x -> let new_acc, y = f !acc x in acc := new_acc; y) in !acc, result ;; (* returns list without adjacent duplicates *) let remove_consecutive_duplicates ?(which_to_keep = `Last) list ~equal = let rec loop to_keep accum = function | [] -> to_keep :: accum | hd :: tl -> if equal hd to_keep then ( let to_keep = match which_to_keep with | `First -> to_keep | `Last -> hd in loop to_keep accum tl) else loop hd (to_keep :: accum) tl in match list with | [] -> [] | hd :: tl -> rev (loop hd [] tl) ;; (** returns sorted version of list with duplicates removed *) let dedup_and_sort list ~compare = match list with | [] | [ _ ] -> list (* performance hack *) | _ -> let equal x x' = compare x x' = 0 in let sorted = sort ~cmp:compare list in (remove_consecutive_duplicates ~equal sorted [@nontail]) ;; let sort l ~compare = Stdlib.ListLabels.sort l ~cmp:compare end module String = struct include StringLabels let chop_prefix_if_exists path ~prefix = if starts_with ~prefix path then StringLabels.sub path ~pos:(length prefix) ~len:(length path - length prefix) else path ;; let rfindi ?pos t ~f = let rec loop i = if i < 0 then None else if f i t.[i] then Some i else loop (i - 1) in let pos = match pos with | Some pos -> pos | None -> String.length t - 1 in loop pos ;; let prefix s n = String.sub s 0 n let last_non_drop ~drop t = rfindi t ~f:(fun _ c -> not (drop c)) let is_whitespace = function | '\t' | '\n' | '\011' (* vertical tab *) | '\012' (* form feed *) | '\r' | ' ' -> true | _ -> false ;; let rstrip ?(drop = is_whitespace) t = match last_non_drop t ~drop with | None -> "" | Some i -> if i = String.length t - 1 then t else prefix t (i + 1) ;; let is_empty = ( = ) "" let to_list s = let rec loop acc i = if i < 0 then acc else loop (s.[i] :: acc) (i - 1) in loop [] (length s - 1) ;; let split_lines = let back_up_at_newline ~t ~pos ~eol = pos := !pos - if !pos > 0 && Char.equal t.[!pos - 1] '\r' then 2 else 1; eol := !pos + 1 in fun t -> let n = length t in if n = 0 then [] else ( (* Invariant: [-1 <= pos < eol]. *) let pos = ref (n - 1) in let eol = ref n in let ac = ref [] in (* We treat the end of the string specially, because if the string ends with a newline, we don't want an extra empty string at the end of the output. *) if Char.equal t.[!pos] '\n' then back_up_at_newline ~t ~pos ~eol; while !pos >= 0 do if Char.( <> ) t.[!pos] '\n' then decr pos else ( (* Because [pos < eol], we know that [start <= eol]. *) let start = !pos + 1 in ac := sub t ~pos:start ~len:(!eol - start) :: !ac; back_up_at_newline ~t ~pos ~eol) done; sub t ~pos:0 ~len:!eol :: !ac) ;; let split_on_char ~on s = String.split_on_char on s let strip = Stdlib.String.trim (* they could be not equivalent *) let concat ?(sep = "") xs = String.concat sep xs let sub = StringLabels.sub let subo ?(pos = 0) ?len src = sub src ~pos ~len: (match len with | Some i -> i | None -> length src - pos) ;; include ( struct let substr_index_gen ~case_sensitive ?pos t ~pattern = Search_patternW.index ?pos (Search_patternW.create ~case_sensitive pattern) ~in_:t ;; let is_substring_gen ~case_sensitive t ~substring = Option.is_some (substr_index_gen t ~pattern:substring ~case_sensitive) ;; let is_substring = is_substring_gen ~case_sensitive:true end : sig val is_substring : t -> substring:t -> bool end) let count s ~f:is_good = String.fold_left (fun acc c -> if is_good c then acc + 1 else acc) 0 s ;; end module Option = struct include Option let to_list = function | Some x -> [ x ] | None -> [] ;; let bind x ~f = Option.bind x f let value x ~default = match x with | Some x -> x | None -> default ;; let map x ~f = match x with | None -> None | Some x -> Some (f x) ;; let value_exn = Option.get let iter ~f = function | Some x -> f x | None -> () ;; end module Staged = struct type 'a t = 'a let stage = Fn.id let unstage = Fn.id end module Source_code_position = struct type t = Lexing.position (* This is the same function as Ppx_here.lift_position_as_string. *) let make_location_string ~pos_fname ~pos_lnum ~pos_cnum ~pos_bol = String.concat ~sep:"" [ pos_fname; ":"; Int.to_string pos_lnum; ":"; Int.to_string (pos_cnum - pos_bol) ] ;; let to_string { Stdlib.Lexing.pos_fname; pos_lnum; pos_cnum; pos_bol } = make_location_string ~pos_fname ~pos_lnum ~pos_cnum ~pos_bol ;; end module Queue = struct include Queue let enqueue q x = add x q let to_list t = let acc = ref [] in Queue.iter (fun x -> acc := x :: !acc) t; List.rev !acc ;; (* let result = ref [] in for i = t.length - 1 downto 0 do result := unsafe_get t i :: !result done; !result *) end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>