Skip to content

Commit 1888e31

Browse files
Merge pull request #36851 from sostock/unique_for_ranges
* Fix allunique(::StepRangeLen) * Add specialized unique(::AbstractRange) method
2 parents 84ef118 + 6ccc543 commit 1888e31

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

base/set.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ _unique_from(itr, out, seen, i) = unique_from(itr, out, seen, i)
166166
return out
167167
end
168168

169+
unique(r::AbstractRange) = allunique(r) ? r : oftype(r, r[begin:begin])
170+
169171
"""
170172
unique(f, itr)
171173
@@ -393,9 +395,7 @@ end
393395

394396
allunique(::Union{AbstractSet,AbstractDict}) = true
395397

396-
allunique(r::AbstractRange{T}) where {T} = (step(r) != zero(T)) || (length(r) <= 1)
397-
allunique(r::StepRange{T,S}) where {T,S} = (step(r) != zero(S)) || (length(r) <= 1)
398-
allunique(r::StepRangeLen{T,R,S}) where {T,R,S} = (step(r) != zero(S)) || (length(r) <= 1)
398+
allunique(r::AbstractRange) = !iszero(step(r)) || length(r) <= 1
399399

400400
filter!(f, s::Set) = unsafe_filter!(f, s)
401401

test/sets.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,13 @@ end
392392
@test @inferred(unique(x->x^2, Integer[3, -4, 5, 4])) == Integer[3, -4, 5]
393393
@test @inferred(unique(iseven, Integer[3, -4, 5, 4]; seen=Set{Bool}())) == Integer[3, -4]
394394
@test @inferred(unique(n -> n % 3, [5, 1, 8, 9, 3, 4, 10, 7, 2, 6])) == [5, 1, 9]
395+
for r = (Base.OneTo(-1), Base.OneTo(0), Base.OneTo(1), Base.OneTo(5),
396+
1:0, 1:1, 1:2, 1:10, 1:.5:.5, 1:.5:1, 1:.5:10, 3:-2:5, 3:-2:3, 3:-2:1,
397+
StepRangeLen(1.0, 2.0, 0), StepRangeLen(1.0, 2.0, 2), StepRangeLen(1.0, 2.0, 3),
398+
StepRangeLen(1.0, 0.0, 0), StepRangeLen(1.0, -0.0, 1), StepRangeLen(1.0, 0.0, 2),
399+
LinRange(1, 2, 3), LinRange(1, 1, 0), LinRange(1, 1, 1), LinRange(1, 1, 10))
400+
@test @inferred(unique(r)) == invoke(unique, Tuple{Any}, r)
401+
end
395402
end
396403

397404
@testset "issue 20105" begin
@@ -458,6 +465,13 @@ end
458465
@test allunique(Date(2018, 8, 7):Day(1):Date(2018, 8, 11)) # JuliaCon 2018
459466
@test allunique(DateTime(2018, 8, 7):Hour(1):DateTime(2018, 8, 11))
460467
@test allunique(('a':1:'c')[1:2]) == true
468+
for r = (Base.OneTo(-1), Base.OneTo(0), Base.OneTo(1), Base.OneTo(5),
469+
1:0, 1:1, 1:2, 1:10, 1:.5:.5, 1:.5:1, 1:.5:10, 3:-2:5, 3:-2:3, 3:-2:1,
470+
StepRangeLen(1.0, 2.0, 0), StepRangeLen(1.0, 2.0, 2), StepRangeLen(1.0, 2.0, 3),
471+
StepRangeLen(1.0, 0.0, 0), StepRangeLen(1.0, -0.0, 1), StepRangeLen(1.0, 0.0, 2),
472+
LinRange(1, 2, 3), LinRange(1, 1, 0), LinRange(1, 1, 1), LinRange(1, 1, 10))
473+
@test allunique(r) == invoke(allunique, Tuple{Any}, r)
474+
end
461475
end
462476
@testset "filter(f, ::$S)" for S = (Set, BitSet)
463477
s = S([1,2,3,4])

0 commit comments

Comments
 (0)