Skip to content

Commit

Permalink
Avoid iterating twice over generators when there is an exception
Browse files Browse the repository at this point in the history
... at least in Julia >= 1.11 which fixed it via JuliaLang/julia#53151
  • Loading branch information
fingolfin committed Nov 24, 2024
1 parent b3b1df9 commit f2951a7
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 9 deletions.
23 changes: 14 additions & 9 deletions src/ordered_dict.jl
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,20 @@ OrderedDict(kv::AbstractDict{K,V}) where {K,V} = OrderedDict{K,V}(kv)
OrderedDict(ps::Pair{K,V}...) where {K,V} = OrderedDict{K,V}(ps)
OrderedDict(ps::Pair...) = OrderedDict(ps)

function OrderedDict(kv)
try
dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
catch e
if isempty(methods(iterate, (typeof(kv),))) ||
!all(x->isa(x, Union{Tuple,Pair}), kv)
throw(ArgumentError("OrderedDict(kv): kv needs to be an iterator of tuples or pairs"))
else
rethrow(e)
@static if VERSION >= v1.11
# see JuliaLang/julia#53151
OrderedDict(kv) = dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
else
function OrderedDict(kv)
try
dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
catch e
if isempty(methods(iterate, (typeof(kv),))) ||
!all(x->isa(x, Union{Tuple,Pair}), kv)
throw(ArgumentError("OrderedDict(kv): kv needs to be an iterator of tuples or pairs"))
else
rethrow(e)
end
end
end
end
Expand Down
7 changes: 7 additions & 0 deletions test/test_ordered_dict.jl
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,13 @@ using OrderedCollections, Test
@test del_slots4 == 0
end

@testset "Issue #86" begin
counter = 0
expensive_function(k) = (counter += 1; k > 2 && error("too large!"))
@test_throws ErrorException OrderedDict(k => expensive_function(k) for k in 1:3)
@test counter == 3
end

@testset "ordered access" begin
od = OrderedDict(:a=>1, :b=>2, :c=>3)
@test popfirst!(od) == (:a => 1)
Expand Down

0 comments on commit f2951a7

Please sign in to comment.