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