···271271 | elt :: rest ->
272272 split_on_close opened (elt::rbefore) rest
273273274274-275274 let rec approx_len acc = function
276276- | [] -> acc
275275+ | [] -> Some acc
277276 | Text x :: r->
278277 let len = Format.utf_8_scalar_width ~pos:0 ~len:(String.length x) x in
279278 approx_len (acc + len) r
···284283 approx_len acc r
285284 | (Tab_break _ | Break _ | Simple_break _ | Flush _ | Newline | If_newline
286285 | Deprecated _ ) :: _ ->
287287- 0
286286+ None
288287289288 type ralign_split = {
290289 close_pos:int;
···298297 let before, rest =
299298 split_on_open_tag ralign_tag [] l in
300299 let mid, after = split_on_close 0 [] rest in
301301- let close_pos = shift + approx_len (approx_len 0 before) mid in
302302- { close_pos; before; mid; after }
300300+ let len = Option.bind (approx_len 0 before) (fun n -> approx_len n mid) in
301301+ match len with
302302+ | None -> Error doc
303303+ | Some len ->
304304+ Ok { close_pos= shift + len; before; mid; after }
305305+306306+ let align_doc max_pos r =
307307+ let aligned_before =
308308+ let before = Open_tag ralign_tag :: r.before in
309309+ if r.close_pos >= max_pos then before
310310+ else Text (String.make (max_pos - r.close_pos) ' ') :: before
311311+ in
312312+ let mid_to_start = Close_tag :: r.mid @ aligned_before in
313313+ { rev = List.rev_append r.after mid_to_start }
303314304315 let align_prefix l =
305316 let l = List.map split_ralign l in
306317 let max_pos =
307307- List.fold_left (fun mx r -> max mx r.close_pos) 0 l
318318+ List.fold_left (fun mx r ->
319319+ match r with
320320+ | Ok r -> max mx r.close_pos
321321+ | Error _ -> mx
322322+ ) 0 l
308323 in
309309- List.map (fun r ->
310310- let aligned_before =
311311- let before = Open_tag ralign_tag :: r.before in
312312- if r.close_pos >= max_pos then before
313313- else Text (String.make (max_pos - r.close_pos) ' ') :: before
314314- in
315315- let mid_to_start = Close_tag :: r.mid @ aligned_before in
316316- { rev = List.rev_append r.after mid_to_start }
317317- ) l
324324+ List.map (Result.fold ~ok:(align_doc max_pos) ~error:Fun.id) l
318325319326 let align_prefix2 x y = match align_prefix [x;y] with
320327 | [x;y] -> x, y