Skip to content

Commit 98e60ff

Browse files
Add allequal (#43354)
* Add `allequal`.
1 parent 32a026a commit 98e60ff

File tree

5 files changed

+68
-2
lines changed

5 files changed

+68
-2
lines changed

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ New language features
1212
to enforce the involved function calls to be (or not to be) inlined. ([#41312])
1313
* The default behavior of observing `@inbounds` declarations is now an option via `auto` in `--check-bounds=yes|no|auto` ([#41551])
1414
* New function `eachsplit(str)` for iteratively performing `split(str)`.
15+
* New function `allequal(itr)` for testing if all elements in an iterator are equal. ([#43354])
1516
* ``, ``, and `` are now allowed as identifier characters ([#42314]).
1617
* Support for Unicode 14.0.0 ([#43443]).
1718
* `try`-blocks can now optionally have an `else`-block which is executed right after the main body only if

base/exports.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ export
497497
# collections
498498
all!,
499499
all,
500+
allequal,
500501
allunique,
501502
any!,
502503
any,

base/set.jl

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ as determined by [`isequal`](@ref), in the order that the first of each
115115
set of equivalent elements originally appears. The element type of the
116116
input is preserved.
117117
118-
See also: [`unique!`](@ref), [`allunique`](@ref).
118+
See also: [`unique!`](@ref), [`allunique`](@ref), [`allequal`](@ref).
119119
120120
# Examples
121121
```jldoctest
@@ -383,7 +383,7 @@ end
383383
384384
Return `true` if all values from `itr` are distinct when compared with [`isequal`](@ref).
385385
386-
See also: [`unique`](@ref), [`issorted`](@ref).
386+
See also: [`unique`](@ref), [`issorted`](@ref), [`allequal`](@ref).
387387
388388
# Examples
389389
```jldoctest
@@ -427,6 +427,40 @@ allunique(::Union{AbstractSet,AbstractDict}) = true
427427

428428
allunique(r::AbstractRange) = !iszero(step(r)) || length(r) <= 1
429429

430+
"""
431+
allequal(itr) -> Bool
432+
433+
Return `true` if all values from `itr` are equal when compared with [`isequal`](@ref).
434+
435+
See also: [`unique`](@ref), [`allunique`](@ref).
436+
437+
!!! compat "Julia 1.8"
438+
The `allequal` function requires at least Julia 1.8.
439+
440+
# Examples
441+
```jldoctest
442+
julia> allequal([])
443+
true
444+
445+
julia> allequal([1])
446+
true
447+
448+
julia> allequal([1, 1])
449+
true
450+
451+
julia> allequal([1, 2])
452+
false
453+
454+
julia> allequal(Dict(:a => 1, :b => 1))
455+
false
456+
```
457+
"""
458+
allequal(itr) = isempty(itr) ? true : all(isequal(first(itr)), itr)
459+
460+
allequal(c::Union{AbstractSet,AbstractDict}) = length(c) <= 1
461+
462+
allequal(r::AbstractRange) = iszero(step(r)) || length(r) <= 1
463+
430464
filter!(f, s::Set) = unsafe_filter!(f, s)
431465

432466
const hashs_seed = UInt === UInt64 ? 0x852ada37cfe8e0ce : 0xcfe8e0ce

doc/src/base/collections.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ Base.indexin
9494
Base.unique
9595
Base.unique!
9696
Base.allunique
97+
Base.allequal
9798
Base.reduce(::Any, ::Any)
9899
Base.foldl(::Any, ::Any)
99100
Base.foldr(::Any, ::Any)

test/sets.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,35 @@ end
511511
@test allunique(r) == invoke(allunique, Tuple{Any}, r)
512512
end
513513
end
514+
515+
@testset "allequal" begin
516+
@test allequal(Set())
517+
@test allequal(Set(1))
518+
@test !allequal(Set([1, 2]))
519+
@test allequal(Dict())
520+
@test allequal(Dict(:a => 1))
521+
@test !allequal(Dict(:a => 1, :b => 2))
522+
@test allequal([])
523+
@test allequal([1])
524+
@test allequal([1, 1])
525+
@test !allequal([1, 1, 2])
526+
@test allequal([:a, :a])
527+
@test !allequal([:a, :b])
528+
@test !allequal(1:2)
529+
@test allequal(1:1)
530+
@test !allequal(4.0:0.3:7.0)
531+
@test allequal(4:-1:5) # empty range
532+
@test !allequal(7:-1:1) # negative step
533+
@test !allequal(Date(2018, 8, 7):Day(1):Date(2018, 8, 11)) # JuliaCon 2018
534+
@test !allequal(DateTime(2018, 8, 7):Hour(1):DateTime(2018, 8, 11))
535+
@test allequal(StepRangeLen(1.0, 0.0, 2))
536+
@test !allequal(StepRangeLen(1.0, 1.0, 2))
537+
@test allequal(LinRange(1, 1, 0))
538+
@test allequal(LinRange(1, 1, 1))
539+
@test allequal(LinRange(1, 1, 2))
540+
@test !allequal(LinRange(1, 2, 2))
541+
end
542+
514543
@testset "filter(f, ::$S)" for S = (Set, BitSet)
515544
s = S([1,2,3,4])
516545
@test s !== filter( isodd, s) == S([1,3])

0 commit comments

Comments
 (0)