The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

format_doc: fix bug in align functions

+22 -15
+22 -15
utils/format_doc.ml
··· 271 271 | elt :: rest -> 272 272 split_on_close opened (elt::rbefore) rest 273 273 274 - 275 274 let rec approx_len acc = function 276 - | [] -> acc 275 + | [] -> Some acc 277 276 | Text x :: r-> 278 277 let len = Format.utf_8_scalar_width ~pos:0 ~len:(String.length x) x in 279 278 approx_len (acc + len) r ··· 284 283 approx_len acc r 285 284 | (Tab_break _ | Break _ | Simple_break _ | Flush _ | Newline | If_newline 286 285 | Deprecated _ ) :: _ -> 287 - 0 286 + None 288 287 289 288 type ralign_split = { 290 289 close_pos:int; ··· 298 297 let before, rest = 299 298 split_on_open_tag ralign_tag [] l in 300 299 let mid, after = split_on_close 0 [] rest in 301 - let close_pos = shift + approx_len (approx_len 0 before) mid in 302 - { close_pos; before; mid; after } 300 + let len = Option.bind (approx_len 0 before) (fun n -> approx_len n mid) in 301 + match len with 302 + | None -> Error doc 303 + | Some len -> 304 + Ok { close_pos= shift + len; before; mid; after } 305 + 306 + let align_doc max_pos r = 307 + let aligned_before = 308 + let before = Open_tag ralign_tag :: r.before in 309 + if r.close_pos >= max_pos then before 310 + else Text (String.make (max_pos - r.close_pos) ' ') :: before 311 + in 312 + let mid_to_start = Close_tag :: r.mid @ aligned_before in 313 + { rev = List.rev_append r.after mid_to_start } 303 314 304 315 let align_prefix l = 305 316 let l = List.map split_ralign l in 306 317 let max_pos = 307 - List.fold_left (fun mx r -> max mx r.close_pos) 0 l 318 + List.fold_left (fun mx r -> 319 + match r with 320 + | Ok r -> max mx r.close_pos 321 + | Error _ -> mx 322 + ) 0 l 308 323 in 309 - List.map (fun r -> 310 - let aligned_before = 311 - let before = Open_tag ralign_tag :: r.before in 312 - if r.close_pos >= max_pos then before 313 - else Text (String.make (max_pos - r.close_pos) ' ') :: before 314 - in 315 - let mid_to_start = Close_tag :: r.mid @ aligned_before in 316 - { rev = List.rev_append r.after mid_to_start } 317 - ) l 324 + List.map (Result.fold ~ok:(align_doc max_pos) ~error:Fun.id) l 318 325 319 326 let align_prefix2 x y = match align_prefix [x;y] with 320 327 | [x;y] -> x, y