class DummyClass:
    pass

d = DummyClass()
#for x in d:
#    print(x)

# how do we make something iterable?

# eg. make our own range

# V1: wrap a list
def our_range_v1(value):
    """ List wrapper to create our own range """
    L = []
    i = 0
    while i < value:
        L.append(i)
        i += 1
    return L

for i in our_range_v1(5):
    print(i)

# V2: create an iterable object
class OurRangeV2:

    def __init__(self, value):
        self.value = value
        self.current = 0

    def __next__(self):
        if self.current < self.value:
            number = self.current
            self.current += 1
            return number
        else:
            raise StopIteration()

    def __iter__(self):
        # what is the iterable part of this object?
        return self

for i in OurRangeV2(5):
    print(i)

# iterable_object = OurRangeV2(5).__iter__()
# done = False
# while not done:
#     try:
#         iterable_object.__next__()
#     except StopIteration:
#         done = True


# V3: Create a generator

def our_range_v3(value):
    num = 0
    while num < value:
        #print(num)
        yield num  # return but don't leave function
        num += 1

for i in our_range_v3(5):
    print(i)


