﻿class Parzyste:
    """
    Klasa Parzyste implementująca pełny protokół iteratora.
    Pozwala na iterację po liczbach parzystych od 0 do ustalonego limitu.
    """
    def __init__(self, limit: int):
        """
        Inicjalizacja iteratora.
        
        Args:
            limit (int): Górna granica ciągu (wyłącznie, jeśli limit to np. 10, to osiągnie 8, chyba że zmienimy logikę).
                         Według wytycznych, sprawdza >= limit.
        """
        self.limit = limit
        self.current = 0
        
    def __iter__(self):
        """
        Metoda magiczna zwracająca sam iterator.
        Zgodnie ze standardem Pythona, __iter__ dla iteratora zwraca self.
        """
        return self
        
    def __next__(self):
        """
        Oblicza i zwraca kolejną liczbę parzystą.
        Gdy limit zostanie osiągnięty, zgłasza wyjątek StopIteration.
        """
        if self.current >= self.limit:
            raise StopIteration
            
        value = self.current
        self.current += 2
        return value

if __name__ == "__main__":
    print("Testowanie iteratora w pętli for:")
    p = Parzyste(10)
    for n in p:
        print(n)
        
    print("\nTestowanie ręczne funkcją next():")
    p2 = Parzyste(6)
    print(next(p2)) # 0
    print(next(p2)) # 2
    print(next(p2)) # 4
    
    try:
        print(next(p2)) # Powinno rzucić StopIteration
    except StopIteration:
        print("Iterator wyczerpany - StopIteration")
        
    print("\nPróba ponownego użycia wyczerpanego iteratora w pętli for:")
    # p jest już wyczerpane
    for n in p:
        print(n)
    print("(Brak wyników, ponieważ stan self.current osiągnął limit i nie jest resetowany)")
