Реализуя
Iterator, снабдите его кастомной реализацией size_hint, nth, count, last и fold, если они могут быть лучше чем реализованный в трейте.size_hint по-умолчанию возвращает (0, None), что значит от нуля до бесконечности. Его можно перегрузить почти всегда.nth по-умолчанию просто вызывает next n+1 раз. Если итератор может прыгнуть - кастомная реализация будет кстати.count по-умолчанию итерируется до конца и подсчитывает. Если размер известен заранее, то стоит перегрузить count. А еще реализовать ExactSizedIterator
Если размер известен и доступ к любому элементу есть, то перегружайте last, что бы этот метод не итерировался от начала и до концаfold по-умолчанию вызывает в цикле next. Если в next есть какая-то дополнительная логика, которая не нужна если итератор поглощается целиком, то кастомный fold поможет избавиться лишних вычислений.К сожалению трейты из метода
try_fold еще недоступны на stable, так что его перегрузить не получится.Но можно еще посмотреть на то что бы перегрузить
all и any.Удачного вам итерирования!