From 72d3af8214f58dcf4353e14903d932883b3497e6 Mon Sep 17 00:00:00 2001 From: Jacob Quinn Date: Sun, 7 Jul 2019 00:25:03 -0600 Subject: [PATCH 1/2] Change IteratorSize on EnumerableMap to just pass through from underlying iterator --- src/enumerable/enumerable_map.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/enumerable/enumerable_map.jl b/src/enumerable/enumerable_map.jl index 0bfe474..6032149 100644 --- a/src/enumerable/enumerable_map.jl +++ b/src/enumerable/enumerable_map.jl @@ -3,7 +3,7 @@ struct EnumerableMap{T, S, Q<:Function} <: Enumerable f::Q end -Base.IteratorSize(::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = !in(Base.IteratorSize(S), (Base.IsInfinite(), Base.SizeUnknown())) ? Base.HasLength() : Base.IteratorSize(S) +Base.IteratorSize(::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = Base.IteratorSize(S) Base.eltype(iter::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = T From ce724030891c8c5d7d982f6f44ab7807436fb49b Mon Sep 17 00:00:00 2001 From: Jacob Quinn Date: Sun, 7 Jul 2019 15:51:27 -0600 Subject: [PATCH 2/2] Make IteratorSize trait definitions more consistent for Enumerables --- src/enumerable/enumerable.jl | 2 ++ src/enumerable/enumerable_map.jl | 2 +- src/enumerable/enumerable_orderby.jl | 2 +- src/enumerable/enumerable_take.jl | 2 +- src/source_iterable.jl | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/enumerable/enumerable.jl b/src/enumerable/enumerable.jl index 57debc4..bbccb5d 100644 --- a/src/enumerable/enumerable.jl +++ b/src/enumerable/enumerable.jl @@ -1,3 +1,5 @@ abstract type Enumerable end Base.IteratorSize(::Type{T}) where {T <: Enumerable} = Base.SizeUnknown() + +haslength(S) = Base.IteratorSize(S) isa Union{Base.HasLength, Base.HasShape} ? Base.HasLength() : Base.IteratorSize(S) \ No newline at end of file diff --git a/src/enumerable/enumerable_map.jl b/src/enumerable/enumerable_map.jl index 6032149..aafe151 100644 --- a/src/enumerable/enumerable_map.jl +++ b/src/enumerable/enumerable_map.jl @@ -3,7 +3,7 @@ struct EnumerableMap{T, S, Q<:Function} <: Enumerable f::Q end -Base.IteratorSize(::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = Base.IteratorSize(S) +Base.IteratorSize(::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = haslength(S) Base.eltype(iter::Type{EnumerableMap{T,S,Q}}) where {T,S,Q} = T diff --git a/src/enumerable/enumerable_orderby.jl b/src/enumerable/enumerable_orderby.jl index 6d4a28d..b815d7e 100644 --- a/src/enumerable/enumerable_orderby.jl +++ b/src/enumerable/enumerable_orderby.jl @@ -4,7 +4,7 @@ struct EnumerableOrderby{T,S,KS<:Function,TKS} <: Enumerable descending::Bool end -Base.IteratorSize(::Type{EnumerableOrderby{T,S,KS,TKS}}) where {T,S,KS,TKS} = (Base.IteratorSize(S) isa Base.HasLength || Base.IteratorSize(S) isa Base.HasShape) ? Base.HasLength() : Base.IteratorSize(S) +Base.IteratorSize(::Type{EnumerableOrderby{T,S,KS,TKS}}) where {T,S,KS,TKS} = haslength(S) Base.eltype(::Type{EnumerableOrderby{T,S,KS,TKS}}) where {T,S,KS,TKS} = T diff --git a/src/enumerable/enumerable_take.jl b/src/enumerable/enumerable_take.jl index fa350a2..0fe29ae 100644 --- a/src/enumerable/enumerable_take.jl +++ b/src/enumerable/enumerable_take.jl @@ -9,7 +9,7 @@ function take(source::Enumerable, n::Integer) return EnumerableTake{T,S}(source, Int(n)) end -Base.IteratorSize(::Type{EnumerableTake{T,S}}) where {T,S} = (Base.IteratorSize(S) isa Base.HasLength || Base.IteratorSize(S) isa Base.HasShape) ? Base.HasLength() : Base.SizeUnknown() +Base.IteratorSize(::Type{EnumerableTake{T,S}}) where {T,S} = haslength(S) Base.eltype(::Type{EnumerableTake{T,S}}) where {T,S} = T diff --git a/src/source_iterable.jl b/src/source_iterable.jl index cfe69c9..3dbccdf 100644 --- a/src/source_iterable.jl +++ b/src/source_iterable.jl @@ -13,7 +13,7 @@ function query(source) return source_enumerable end -Base.IteratorSize(::Type{EnumerableIterable{T,S}}) where {T,S} = Base.IteratorSize(S) isa Base.HasShape ? Base.HasLength() : Base.IteratorSize(S) +Base.IteratorSize(::Type{EnumerableIterable{T,S}}) where {T,S} = haslength(S) Base.eltype(::Type{EnumerableIterable{T,S}}) where {T,S} = T