From 3d7932e58d15dce691396c6b76aee7d6c5a6f14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 4 Oct 2019 12:26:53 +0200 Subject: [PATCH 1/6] add setindex for named tuples --- base/namedtuple.jl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/base/namedtuple.jl b/base/namedtuple.jl index 790a080bd4129..c57ba1b51960c 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -300,3 +300,27 @@ function structdiff(a::NamedTuple{an}, b::Union{NamedTuple{bn}, Type{NamedTuple{ NamedTuple{names,types}(map(n->getfield(a, n), names)) end end + +""" + setindex(nt::NamedTuple{names}, val::V, key::K) where {names, V, K} + +Constructs a new `NamedTuple` with the key `key` set to `val`. +If `key` is already in the keys of `nt`, `val` replaces the old value. + +```jldoctest +julia> nt = (a = 3,) +(a = 3,) + +julia> setindex(nt, 33, :b) +(a = 3, b = 33) + +julia> setindex(nt, 4, :a) +(a = 4,) + +julia> setindex(nt, "a", :a) +(a = "a",) +``` +""" +function setindex(nt::NamedTuple{names}, v::V, idx::Symbol) where {names, V, K} + merge(nt, ((idx, v),)) +end From e3c0d92cc8c3eada1afbd8f25e8719f53cf1361f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 4 Oct 2019 13:34:26 +0200 Subject: [PATCH 2/6] qualified name --- base/namedtuple.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/namedtuple.jl b/base/namedtuple.jl index c57ba1b51960c..3e984aa241262 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -311,13 +311,13 @@ If `key` is already in the keys of `nt`, `val` replaces the old value. julia> nt = (a = 3,) (a = 3,) -julia> setindex(nt, 33, :b) +julia> Base.setindex(nt, 33, :b) (a = 3, b = 33) -julia> setindex(nt, 4, :a) +julia> Base.setindex(nt, 4, :a) (a = 4,) -julia> setindex(nt, "a", :a) +julia> Base.setindex(nt, "a", :a) (a = "a",) ``` """ From 33ceb4e6ba1389022df9aad51c83d8cea67bd6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 4 Oct 2019 19:11:03 +0200 Subject: [PATCH 3/6] Update base/namedtuple.jl Co-Authored-By: Matt Bauman --- base/namedtuple.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/namedtuple.jl b/base/namedtuple.jl index 3e984aa241262..e077c9b15d23a 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -321,6 +321,6 @@ julia> Base.setindex(nt, "a", :a) (a = "a",) ``` """ -function setindex(nt::NamedTuple{names}, v::V, idx::Symbol) where {names, V, K} +function setindex(nt::NamedTuple, v, idx::Symbol) merge(nt, ((idx, v),)) end From e7a520f37be165baf8eca5ee4b74963a48df1d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Mon, 7 Oct 2019 11:06:34 +0200 Subject: [PATCH 4/6] added tests --- test/namedtuple.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/namedtuple.jl b/test/namedtuple.jl index 17438a46c7b7f..af4c20915acda 100644 --- a/test/namedtuple.jl +++ b/test/namedtuple.jl @@ -267,3 +267,11 @@ let n = NamedTuple{(:T,), Tuple{Type{Float64}}}((Float64,)) @test n isa NamedTuple{(:T,), Tuple{Type{Float64}}} @test n.T === Float64 end + +# setindex +let nt0 = NamedTuple(), nt1 = (a=33,), nt2 = (a=0, b=:v) + @test Base.setindex(nt0, 33, :a) == nt1 + @test Base.setindex(Base.setindex(nt1, 0, :a), :v, :b) == nt2 + @test Base.setindex(nt1, "value", :a) == (a="value",) + @test Base.setindex(nt1, "value", :a) isa NamedTuple{(:a,),<:Tuple{AbstractString}} +end From 0a92d5b102a0b49722c7e27ae25a1cd0b913e53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Thu, 10 Oct 2019 16:16:04 +0200 Subject: [PATCH 5/6] Update base/namedtuple.jl Co-Authored-By: Jeff Bezanson --- base/namedtuple.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/namedtuple.jl b/base/namedtuple.jl index e077c9b15d23a..457bab2db967a 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -322,5 +322,5 @@ julia> Base.setindex(nt, "a", :a) ``` """ function setindex(nt::NamedTuple, v, idx::Symbol) - merge(nt, ((idx, v),)) + merge(nt, (; idx => v)) end From 8aa989a3b11321634ef5daab46fc89ff9549133d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Thu, 10 Oct 2019 16:16:23 +0200 Subject: [PATCH 6/6] Update base/namedtuple.jl Co-Authored-By: Jeff Bezanson --- base/namedtuple.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/namedtuple.jl b/base/namedtuple.jl index 457bab2db967a..32d0bac11a254 100644 --- a/base/namedtuple.jl +++ b/base/namedtuple.jl @@ -302,7 +302,7 @@ function structdiff(a::NamedTuple{an}, b::Union{NamedTuple{bn}, Type{NamedTuple{ end """ - setindex(nt::NamedTuple{names}, val::V, key::K) where {names, V, K} + setindex(nt::NamedTuple, val, key::Symbol) Constructs a new `NamedTuple` with the key `key` set to `val`. If `key` is already in the keys of `nt`, `val` replaces the old value.