let max_gap_of_positional vl =
  let cmp = Order.compose compare_containment compare_positional in
  let vl = List.sort ~cmp vl in
  let rec loop ans vl =
    match vl with
      | [] | _::[] -> ans
      | u::v::vl ->
          if before u v
          then loop (max ans (gap u v)) (v::vl)
          else failwith (sprintf "ranges %s and %s not positionally comparable" (to_string u) (to_string v))
  in
  match vl with
    | [] | _::[] -> failwith "given fewer than two ranges"
    | u::v::vl -> loop (gap u v) (v::vl)