From 4515719125a6fc8182ecfaa5e14200ee227e5a4a Mon Sep 17 00:00:00 2001 From: Lilith Orion Hafner Date: Mon, 6 Jan 2025 16:44:42 -0600 Subject: [PATCH 1/4] Support sort(keys(::Dict)) and sort(values(::Dict)) --- base/sort.jl | 18 +++++++++++++++--- test/sorting.jl | 8 ++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/base/sort.jl b/base/sort.jl index 8254f56b3f952..6f11d2c3b644e 100644 --- a/base/sort.jl +++ b/base/sort.jl @@ -1620,7 +1620,7 @@ defalg(v::AbstractArray) = DEFAULT_STABLE defalg(v::AbstractArray{<:Union{Number, Missing}}) = DEFAULT_UNSTABLE defalg(v::AbstractArray{Missing}) = DEFAULT_UNSTABLE # for method disambiguation defalg(v::AbstractArray{Union{}}) = DEFAULT_UNSTABLE # for method disambiguation -defalg(v::NTuple) = DEFAULT_STABLE +defalg(v) = DEFAULT_STABLE """ sort!(v; alg::Base.Sort.Algorithm=Base.Sort.defalg(v), lt=isless, by=identity, rev::Bool=false, order::Base.Order.Ordering=Base.Order.Forward) @@ -1739,12 +1739,16 @@ function sort!(v::AbstractVector{T}; end """ - sort(v::Union{AbstractVector, NTuple}; alg::Base.Sort.Algorithm=Base.Sort.defalg(v), lt=isless, by=identity, rev::Bool=false, order::Base.Order.Ordering=Base.Order.Forward) + sort(v; alg::Base.Sort.Algorithm=Base.Sort.defalg(v), lt=isless, by=identity, rev::Bool=false, order::Base.Order.Ordering=Base.Order.Forward) + sort(v::NTuple; kws...) -> NTuple Variant of [`sort!`](@ref) that returns a sorted copy of `v` leaving `v` itself unmodified. +When calling `sort` on the [`keys`](@ref) or [`values](@ref) of a dictionary, `v` is +collected and then sorted in place. + !!! compat "Julia 1.12" - Sorting `NTuple`s requires Julia 1.12 or later. + Sorting `NTuple`s , keys sets, and values iterators requires Julia 1.12 or later. # Examples ```jldoctest @@ -1761,10 +1765,18 @@ julia> v 3 1 2 + +julia> sort(values(Dict('a'=>2, 'b'=>1))) +2-element Vector{Int64}: + 1 + 2 ``` """ sort(v::AbstractVector; kws...) = sort!(copymutable(v); kws...) +const COLLECT_ON_SORT_TYPES = Union{Base.KeySet, Base.ValueIterator} +sort(v::COLLECT_ON_SORT_TYPES; kws...) = sort!(collect(v); kws...) + function sort(x::NTuple; alg::Algorithm=defalg(x), lt=isless, diff --git a/test/sorting.jl b/test/sorting.jl index e16b30de5bfc8..ab4250fef411b 100644 --- a/test/sorting.jl +++ b/test/sorting.jl @@ -110,6 +110,14 @@ end @test Base.infer_return_type(sort, Tuple{Tuple{Vararg{Int}}}) == Tuple{Vararg{Int}} end +@testset "KeySet and ValueIterator" begin + x = Dict(rand() => randstring() for _ in 1:10) + x0 = deepcopy(x) + @test issorted(sort(keys(x))::Vector{Float64}) + @test issorted(sort(values(x))::Vector{String}) + @test x == x0 +end + @testset "partialsort" begin @test partialsort([3,6,30,1,9],3) == 6 @test partialsort([3,6,30,1,9],3:4) == [6,9] From d6c68a851a976126e798d9b4601ffa4d25985002 Mon Sep 17 00:00:00 2001 From: Lilith Orion Hafner Date: Fri, 10 Jan 2025 08:06:49 -0600 Subject: [PATCH 2/4] Switch from `->` to `::` Co-authored-by: Neven Sajko <4944410+nsajko@users.noreply.github.com> --- base/sort.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/sort.jl b/base/sort.jl index 6f11d2c3b644e..64d2d76080f9f 100644 --- a/base/sort.jl +++ b/base/sort.jl @@ -1740,7 +1740,7 @@ end """ sort(v; alg::Base.Sort.Algorithm=Base.Sort.defalg(v), lt=isless, by=identity, rev::Bool=false, order::Base.Order.Ordering=Base.Order.Forward) - sort(v::NTuple; kws...) -> NTuple + sort(v::NTuple; kws...)::NTuple Variant of [`sort!`](@ref) that returns a sorted copy of `v` leaving `v` itself unmodified. From a6e6ee0eff4b89770dc45e71ca8ad5750fe87627 Mon Sep 17 00:00:00 2001 From: Lilith Orion Hafner Date: Fri, 14 Feb 2025 10:00:34 -0600 Subject: [PATCH 3/4] Update compat because 1.12 has branched --- base/sort.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/base/sort.jl b/base/sort.jl index 64d2d76080f9f..8196601f3757f 100644 --- a/base/sort.jl +++ b/base/sort.jl @@ -1748,7 +1748,10 @@ When calling `sort` on the [`keys`](@ref) or [`values](@ref) of a dictionary, `v collected and then sorted in place. !!! compat "Julia 1.12" - Sorting `NTuple`s , keys sets, and values iterators requires Julia 1.12 or later. + Sorting `NTuple`s requires Julia 1.12 or later. + +!!! compat "Julia 1.13" + Sorting keys sets and values iterators requires Julia 1.13 or later. # Examples ```jldoctest From 90a846ccd928079e264b5d6c8446ae07b372d17d Mon Sep 17 00:00:00 2001 From: Lilith Orion Hafner Date: Fri, 14 Feb 2025 10:03:10 -0600 Subject: [PATCH 4/4] Update NEWS.md Including updating the version in the title --- NEWS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index fb3e524bf2cf7..352ec6dc8ef0c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -Julia v1.12 Release Notes +Julia v1.13 Release Notes ======================== New language features @@ -25,6 +25,8 @@ New library functions New library features -------------------- +`sort(keys(::Dict))` and `sort(values(::Dict))` now automatically collect, they previously threw ([#56978]). + Standard library changes ------------------------