import itertools as it

# wbudowane obiekty iterowalne
# built-in iterables

if __name__ == "__main__":
    print("map - nakladanie funkcji na obiekt iterowalny (np. range)")
    for i in map(lambda x: x**2, range(10)):
        print(i)

    print("filter - iterowanie z pominieciem elementow nie spelniajacych warunku")
    for i in filter(lambda n: n % 2 == 0, range(10)):
        print(i)

    print("enumerate - iteracja po parach (liczba, element)")
    for i, n in enumerate("abcdef"):
        print(i, n)

    print("enumerate z wybrana liczba poczatkowa")
    for i, n in enumerate([0, 20, -1, 200, "x"], 100):
        print(i, n)

    print("itertools - dodatkowe (np. nieskonczone) obiekty iterowalne i operacje na nich")
    print("tutaj: demonstracja niektorych z nich")

    print("count - nieskonczony ciag arytmetyczny")
    for i in it.count():
        print(i)
        if i > 10:
            print("...")
            break

    print("count z poczatkiem i krokiem")
    for i in it.count(3, -1):
        print(i)
        if i < -10:
            print("...")
            break

    print("repeat - powtarza wartosc (skonczenie lub nieskonczenie wiele razy)")
    for i in it.repeat('x', 5): # bez 5 dla nieskonczonego ciagu
        print(i)


    print("chain - iteruje po kolejnych obiektach")
    for i in it.chain(range(5), "abcd", [10, 20, -100]):
        print(i)


    print("takewhile - iteruje dopoki kolejne obiekty spelniaja dany warunek")
    for i in it.takewhile(lambda n: n < 10, it.count()):
        print(i)

    print("takewhile - iteruje odkad obiekty nie spelniaja warunku")
    for i in it.dropwhile(lambda n: n < 10, range(20)):
        print(i)
