From 1cfccc535e97a4a5a8dcb7b1728871bbd6df2f7b Mon Sep 17 00:00:00 2001 From: Haydon Ryan Date: Wed, 2 Sep 2026 18:15:52 -0500 Subject: [PATCH 1/2] uucore: make Range::merge linear instead of quadratic --- src/uucore/src/lib/features/ranges.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/uucore/src/lib/features/ranges.rs b/src/uucore/src/lib/features/ranges.rs index b2e5d0cf133..c7e5351fe21 100644 --- a/src/uucore/src/lib/features/ranges.rs +++ b/src/uucore/src/lib/features/ranges.rs @@ -246,16 +246,14 @@ impl Range { /// Is guaranteed to return only disjoint ranges in a sorted order. pub fn merge(mut ranges: Vec) -> Vec { ranges.sort(); - - // merge overlapping ranges - for i in 0..ranges.len() { - let j = i + 1; - - while j < ranges.len() && ranges[j].low <= ranges[i].high { - let j_high = ranges.remove(j).high; - ranges[i].high = max(ranges[i].high, j_high); + ranges.dedup_by(|a, b| { + if a.low <= b.high { + b.high = max(b.high, a.high); + true + } else { + false } - } + }); ranges } } From c64a034412fe188e7a2fefd7bf6a1e15c70b4e83 Mon Sep 17 00:00:00 2001 From: Haydon Ryan Date: Fri, 18 Sep 2026 10:26:03 -0500 Subject: [PATCH 2/2] uucore: use sort_unstable_by_key in Range::merge Co-authored-by: anastygnome <15268361+anastygnome@users.noreply.github.com> --- src/uucore/src/lib/features/ranges.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/ranges.rs b/src/uucore/src/lib/features/ranges.rs index c7e5351fe21..5688e93d8a2 100644 --- a/src/uucore/src/lib/features/ranges.rs +++ b/src/uucore/src/lib/features/ranges.rs @@ -245,7 +245,7 @@ impl Range { /// /// Is guaranteed to return only disjoint ranges in a sorted order. pub fn merge(mut ranges: Vec) -> Vec { - ranges.sort(); + ranges.sort_unstable_by_key(|r| r.low); ranges.dedup_by(|a, b| { if a.low <= b.high { b.high = max(b.high, a.high);