Skip to content
6 changes: 6 additions & 0 deletions base/generator.jl
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ Base.HasShape{1}()

julia> Base.IteratorSize((2,3))
Base.HasLength()

julia> Base.IteratorSize(Iterators.cycle(1:5))
Base.SizeUnknown()

julia> Base.IteratorSize(Iterators.cycle(1:0))
Base.SizeUnknown()
```
"""
IteratorSize(x) = IteratorSize(typeof(x))
Expand Down
5 changes: 4 additions & 1 deletion base/iterators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1017,7 +1017,10 @@ cycle(xs, n::Integer) = flatten(repeated(xs, n))

eltype(::Type{Cycle{I}}) where {I} = eltype(I)
IteratorEltype(::Type{Cycle{I}}) where {I} = IteratorEltype(I)
IteratorSize(::Type{Cycle{I}}) where {I} = IsInfinite() # XXX: this is false if iterator ever becomes empty
function IteratorSize(::Type{Cycle{I}}) where {I}
IS = IteratorSize(I)
(IS === IsInfinite() || IS == HasShape{0}()) ? IsInfinite() : SizeUnknown()
end

iterate(it::Cycle) = iterate(it.xs)
isdone(it::Cycle) = isdone(it.xs)
Expand Down
12 changes: 12 additions & 0 deletions test/iterators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1221,6 +1221,18 @@ end
@test isempty(Docs.undocumented_names(Iterators))
end

@testset "cycle IteratorSize (#53169)" begin
@test Base.IteratorSize(Iterators.cycle(1:3)) == Base.SizeUnknown()
@test Base.IteratorSize(Iterators.cycle(1:0)) == Base.SizeUnknown()
@test Base.IteratorSize(Iterators.cycle(7)) == Base.IsInfinite()
@test collect(Iterators.cycle(1:0))::Vector{Int} == Int[]
@test Base.IteratorSize(Iterators.cycle(Iterators.Repeated(6))) == Base.IsInfinite()

@test Base.IteratorSize(typeof(Iterators.cycle(1:3))) == Base.SizeUnknown()
@test Base.IteratorSize(typeof(Iterators.cycle(1:0))) == Base.SizeUnknown()
@test Base.IteratorSize(typeof(Iterators.cycle(Iterators.Repeated(6)))) == Base.IsInfinite()
end

# Filtered list comprehension (`Filter` construct) type inference
@test Base.infer_return_type((Vector{Any},)) do xs
[x for x in xs if x isa Int]
Expand Down
Loading