blob: bc42eaab9deb77779e0c656fc68c3af3d03672d3 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
def start_point(ranges):
line1, col1, _, _ = ranges
return (line1, col1)
def end_point(ranges):
_, _, line2, col2 = ranges
return (line2, col2)
def combine(start, end):
line1, col1, _, _ = start
_, _, line2, col2 = end
return (line1, col1, line2, col2)
def merge_ranges(ranges):
if not ranges:
return []
ranges.sort()
result = ranges[:1]
for range in ranges[1:]:
current = result[-1]
if start_point(range) <= end_point(current):
if end_point(range) > end_point(current):
result[-1] = combine(current, range)
else:
result.append(range)
return result
if __name__ == "__main__":
# Run unit tests.
ranges = [(1, 1, 2, 2), (1, 3, 1, 17)]
expected = [(1, 1, 2, 2)]
actual = merge_ranges(ranges)
assert expected == actual, \
f"Expected {expected}, actual {actual}"
ranges = [(1, 1, 2, 2), (1, 3, 2, 17)]
expected = [(1, 1, 2, 17)]
actual = merge_ranges(ranges)
assert expected == actual, \
f"Expected {expected}, actual {actual}"
ranges = [(1, 1, 2, 2), (2, 3, 2, 17)]
expected = [(1, 1, 2, 2), (2, 3, 2, 17)]
actual = merge_ranges(ranges)
assert expected == actual, \
f"Expected {expected}, actual {actual}"