let find_prev line diffs =
let rec iter acc_d acc_l = function
[] -> None, 0
| d :: q ->
if (first_of_diff d) < line - acc_l then
(
prerr_endline (Printf.sprintf "first=%d line=%d acc_l=%d" (first_of_diff d) line acc_l);
let sup =
match d with
Add (_,_,_) -> 0
| Delete (i2,i,_)
| Change (i2,_,i,_) -> (range_of_index i2)
in
match q with
[] -> (Some d, acc_l + sup)
| _ -> iter (Some d) (acc_l + sup) q
)
else
acc_d, acc_l
in
let (diff_opt, decal) = iter None 0 diffs in
match diff_opt with
Some d -> Some ((first_of_diff d) + decal - 1)
| None ->
match List.rev diffs with
h :: _ ->
let decal = List.fold_left
(fun acc -> fun d -> (range_of_index2_of_diff d) + acc)
0
diffs
in
Some ((first_of_diff h) + decal - (range_of_index2_of_diff h) -1 )
| [] -> None