Skip to content

Commit 5b5c634

Browse files
murari0johanmon
authored andcommitted
Add get(::Function, ::ImmutableDict, key) to resolve JuliaLang#40413 (JuliaLang#40471)
1 parent ddb9b6f commit 5b5c634

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

base/dict.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,14 @@ function get(dict::ImmutableDict, key, default)
792792
return default
793793
end
794794

795+
function get(default::Callable, dict::ImmutableDict, key)
796+
while isdefined(dict, :parent)
797+
isequal(dict.key, key) && return dict.value
798+
dict = dict.parent
799+
end
800+
return default()
801+
end
802+
795803
# this actually defines reverse iteration (e.g. it should not be used for merge/copy/filter type operations)
796804
function iterate(d::ImmutableDict{K,V}, t=d) where {K, V}
797805
!isdefined(t, :parent) && return nothing

test/dict.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@ import Base.ImmutableDict
684684
d4 = ImmutableDict(d3, k2 => v1)
685685
dnan = ImmutableDict{String, Float64}(k2, NaN)
686686
dnum = ImmutableDict(dnan, k2 => 1)
687+
f(x) = x^2
687688

688689
@test isempty(collect(d))
689690
@test !isempty(collect(d1))
@@ -729,6 +730,18 @@ import Base.ImmutableDict
729730
@test get(d4, "key1", :default) === v2
730731
@test get(d4, "foo", :default) === :default
731732
@test get(d, k1, :default) === :default
733+
@test get(d1, "key1") do
734+
f(2)
735+
end === v1
736+
@test get(d4, "key1") do
737+
f(4)
738+
end === v2
739+
@test get(d4, "foo") do
740+
f(6)
741+
end === 36
742+
@test get(d, k1) do
743+
f(8)
744+
end === 64
732745
@test d1["key1"] === v1
733746
@test d4["key1"] === v2
734747
@test empty(d3) === d

0 commit comments

Comments
 (0)