package linol
LSP server library
Install
Dune Dependency
Authors
Maintainers
Sources
linol-0.10.tbz
sha256=174bb8cad5b8b0c260d62b0a85da13c4f5caba4fcee042ee58284b09de7896ea
sha512=77460788407c72a33fbe289ec9c78421117543594b3524a5c8fe836f0e272c5ceb1e1074b91c1d1f476f89b75b6f63847a8021675a782ff36457c9626121a7f4
doc/src/linol.lsp/substring.ml.html
Source file substring.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
open Import type t = { pos : int ; len : int ; base : string } let empty = { pos = 0; len = 0; base = "" } let of_slice base ~pos ~len = assert (pos >= 0 && pos + len <= String.length base); assert (len >= 0); { base; pos; len } ;; let of_string base = { base; len = String.length base; pos = 0 } exception Result of int let length t = t.len let compare t { pos; len; base } = try for i = 0 to min t.len len - 1 do match Char.compare t.base.[i + t.pos] base.[i + pos] with | 0 -> () | i -> raise_notrace (Result i) done; t.len - len with | Result r -> r ;; let concat arr = let len = Array_view.fold_left ~f:(fun acc a -> acc + a.len) ~init:0 arr in let dst = Bytes.make len '\000' in let dst_pos = ref 0 in for i = 0 to Array_view.length arr - 1 do let { pos = src_pos; len; base = src } = Array_view.get arr i in Bytes.blit_string ~src ~src_pos ~dst ~dst_pos:!dst_pos ~len; dst_pos := !dst_pos + len done; Bytes.unsafe_to_string dst ;; let drop t len = if len = t.len then empty else if len = 0 then t else ( assert (len > 0); let len = min len t.len in let pos = t.pos + len in let len = t.len - len in { t with pos; len }) ;; let take t len = if len = t.len then t else if len = 0 then empty else ( assert (len > 0); let len = min t.len len in { t with len }) ;; let to_string { base; len; pos } = String.sub base ~pos ~len let add_buffer { base; len; pos } buf = Buffer.add_substring buf base pos len let split_at t n = take t n, drop t n let rsplit_at t n = let n = t.len - n in split_at t n ;; let index_from = let rec loop s pos len c = if pos >= len then None else if s.[pos] = c then Some pos else loop s (pos + 1) len c in fun t ~pos c -> if pos < 0 || pos >= t.len then invalid_arg "Substring.index_from: out of bounds"; match loop t.base (t.pos + pos) (t.pos + t.len) c with | None -> None | Some pos -> Some (pos - t.pos) ;; let rindex_from = let rec loop s pos outside c = if pos <= outside then None else if s.[pos] = c then Some pos else loop s (pos - 1) outside c in fun t ~pos c -> if pos < 0 || pos > t.len then invalid_arg "Substring.rindex_from: out of bounds"; match loop t.base (t.pos + pos - 1) (t.pos - 1) c with | None -> None | Some c -> Some (c - t.pos) ;; let get_exn t i = if i < t.len then t.base.[t.pos + i] else invalid_arg "Substring.get: out of bounds" ;; let rindex = let rec loop s pos outside c = if pos <= outside then None else if s.[pos] = c then Some pos else loop s (pos - 1) outside c in fun t c -> loop t.base (t.len + t.pos - 1) (t.pos - 1) c ;; let blit t ~dst ~dst_pos = Bytes.blit_string ~src:t.base ~src_pos:t.pos ~len:t.len ~dst ~dst_pos ;; type move = { newlines : int ; consumed : int } let move_right = let rec loop base ~newlines ~pos ~outside = if pos = outside then newlines, pos else if base.[pos] = '\n' then loop base ~newlines:(newlines + 1) ~pos:(pos + 1) ~outside else loop base ~newlines ~pos:(pos + 1) ~outside in fun t ~pos ~len -> if pos = t.len then { newlines = 0; consumed = 0 } else ( assert (len >= 0); assert (pos >= 0 && pos <= t.len); let real_pos = t.pos + pos in let outside = real_pos + min (t.len - pos) len in let newlines, final_pos = loop t.base ~newlines:0 ~pos:real_pos ~outside in { newlines; consumed = final_pos - real_pos }) ;; let move_left = let rec loop base ~newlines ~pos ~outside = if pos = outside then newlines, pos else if base.[pos] = '\n' then loop base ~newlines:(newlines + 1) ~pos:(pos - 1) ~outside else loop base ~newlines ~pos:(pos - 1) ~outside in fun t ~pos ~len -> if pos = 0 then { newlines = 0; consumed = 0 } else ( assert (pos >= 0 && pos <= t.len); let real_pos = t.pos + pos - 1 in let outside = max (t.pos - 1) (real_pos - len) in let newlines, final_pos = loop t.base ~newlines:0 ~pos:real_pos ~outside in { newlines; consumed = real_pos - final_pos }) ;; module Map = MoreLabels.Map.Make (struct type nonrec t = t let compare = compare end) module Uutf = struct let src t ~pos decoder = let len = t.len - pos in if len > 0 then ( let pos = t.pos + pos in Uutf.Manual.src decoder (Bytes.unsafe_of_string t.base) pos len) ;; end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>