Skip to content

Commit 9abe6a2

Browse files
authored
Merge pull request #936 from asinghvi17/patch-1
Refactor `not_iterator_of_pairs` to stop using `InteractiveUtils`
2 parents 70363ab + 81eef60 commit 9abe6a2

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

Project.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
33
version = "0.19.0-DEV"
44

55
[deps]
6-
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
76
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
87

98
[compat]

src/dict_support.jl

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
# support functions
22

3-
using InteractiveUtils: methodswith
4-
5-
function not_iterator_of_pairs(kv)
6-
return any(x->isempty(methodswith(typeof(kv), x, true)),
7-
[iterate]) ||
8-
any(x->!isa(x, Union{Tuple,Pair}), kv)
3+
function not_iterator_of_pairs(kv::T) where T
4+
# if the object is not iterable, return true, else check the eltype of the iteration
5+
Base.isiterable(T) || return true
6+
# else, check if we can check `eltype`:
7+
if Base.IteratorEltype(kv) isa Base.HasEltype
8+
typ = eltype(kv)
9+
if !(typ == Any)
10+
return !(typ <: Union{<: Tuple, <: Pair})
11+
end
12+
end
13+
# we can't check eltype, or eltype is not useful,
14+
# so brute force it.
15+
return any(x->!isa(x, Union{Tuple,Pair}), kv)
916
end

test/test_priority_queue.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,40 @@ import Base.Order.Reverse
105105
@test_throws ArgumentError PriorityQueue(Reverse, Reverse)
106106
end
107107

108+
@testset "Strange eltype situations" begin
109+
@testset "Eltype unknown" begin
110+
struct EltypeUnknownIterator{T}
111+
x::T
112+
end
113+
Base.IteratorEltype(::EltypeUnknownIterator) = Base.EltypeUnknown()
114+
Base.iterate(i::EltypeUnknownIterator) = Base.iterate(i.x)
115+
Base.iterate(i::EltypeUnknownIterator, state) = Base.iterate(i.x, state)
116+
Base.IteratorSize(i::EltypeUnknownIterator) = Base.IteratorSize(i.x)
117+
Base.length(i::EltypeUnknownIterator) = Base.length(i.x)
118+
Base.size(i::EltypeUnknownIterator) = Base.size(i.x)
119+
120+
@test_nowarn PriorityQueue(Dict(zip(1:5, 2:6)))
121+
@test_nowarn PriorityQueue(EltypeUnknownIterator(Dict(zip(1:5, 2:6))))
122+
@test_throws ArgumentError PriorityQueue(EltypeUnknownIterator(['a']))
123+
end
124+
125+
@testset "Eltype any" begin
126+
struct EltypeAnyIterator{T}
127+
x::T
128+
end
129+
Base.IteratorEltype(::EltypeAnyIterator) = Base.HasEltype()
130+
Base.eltype(::EltypeAnyIterator) = Any
131+
Base.iterate(i::EltypeAnyIterator) = Base.iterate(i.x)
132+
Base.iterate(i::EltypeAnyIterator, state) = Base.iterate(i.x, state)
133+
Base.IteratorSize(i::EltypeAnyIterator) = Base.IteratorSize(i.x)
134+
Base.length(i::EltypeAnyIterator) = Base.length(i.x)
135+
Base.size(i::EltypeAnyIterator) = Base.size(i.x)
136+
137+
@test_nowarn PriorityQueue(EltypeAnyIterator(Dict(zip(1:5, 2:6))))
138+
@test_throws ArgumentError PriorityQueue(EltypeAnyIterator(['a']))
139+
end
140+
end
141+
108142
end
109143

110144
@testset "PriorityQueueMethods" begin

0 commit comments

Comments
 (0)