@@ -459,11 +459,6 @@ struct ExponentsIterator{M,D<:Union{Nothing,Int},O}
459459 ),
460460 )
461461 end
462- if length (object) == 0 && isnothing (maxdegree)
463- # Otherwise, it will incorrectly think that the iterator is infinite
464- # while it actually has zero elements
465- maxdegree = mindegree
466- end
467462 return new {M,typeof(maxdegree),typeof(object)} (
468463 object,
469464 mindegree,
@@ -477,21 +472,39 @@ Base.eltype(::Type{ExponentsIterator{M,D,O}}) where {M,D,O} = O
477472function Base. IteratorSize (:: Type{<:ExponentsIterator{M,Nothing}} ) where {M}
478473 return Base. IsInfinite ()
479474end
475+ function Base. IteratorSize (it:: ExponentsIterator{M,Nothing} ) where {M}
476+ if isempty (it. object)
477+ return Base. HasLength ()
478+ end
479+ return Base. IsInfinite ()
480+ end
480481function Base. IteratorSize (:: Type{<:ExponentsIterator{M,Int}} ) where {M}
481482 return Base. HasLength ()
482483end
483484
484- function Base . length (it:: ExponentsIterator{M,Int} ) where {M}
485- if it . maxdegree < it. mindegree
485+ function _length (it:: ExponentsIterator , maxdegree)
486+ if maxdegree < it. mindegree
486487 return 0
487488 end
488- len = binomial (nvariables (it) + it . maxdegree, nvariables (it))
489+ len = binomial (nvariables (it) + maxdegree, nvariables (it))
489490 if it. mindegree > 0
490491 len -= binomial (nvariables (it) + it. mindegree - 1 , nvariables (it))
491492 end
492493 return len
493494end
494495
496+ function Base. length (it:: ExponentsIterator{M,Int} ) where {M}
497+ return _length (it, it. maxdegree)
498+ end
499+
500+ function Base. length (it:: ExponentsIterator{M,Nothing} ) where {M}
501+ if isempty (it. object)
502+ return _length (it, it. mindegree)
503+ else
504+ error (" The iterator is infinity because `maxdegree` is `nothing`." )
505+ end
506+ end
507+
495508nvariables (it:: ExponentsIterator ) = length (it. object)
496509
497510_last_lex_index (n, :: Type{LexOrder} ) = n
0 commit comments