#!/usr/bin/env python

try:                  # python 2.4
    to_visit = set()
    visited = set()
except NameError:     # python 2.3
    from sets import Set
    to_visit = Set()
    visited = Set()

def add_to_gen(obj):
    """
    add obj to generator, so obj will pop at some point in the future
    """
    global visited, to_visit
    if obj not in visited.union(to_visit):
        to_visit.add(obj)

def generator():
    while to_visit:          # while we have items to visit
        obj = to_visit.pop() # pop an item from the "to visit" set
        visited.add(obj)     # and add it to the "visited" set
        yield obj            # yield the obj back to the user

def main1():
    print "================== main 1 ==================="
    global visited, to_visit
    visited.clear()
    to_visit.clear()
    to_visit.update([1,2,3,4,5,6,7,8])

    g = generator()
    for i in g:
        print i
        if (i == (i/3)*3):
            add_to_gen((i+1)*4)
        print "to visit = %s" % to_visit
        print "visited = %s" %visited


def main2():
    print "================== main 2 ==================="
    global visited, to_visit
    visited.clear()
    to_visit.clear()
    to_visit.update([1,2,3,4,5,6,7,8])

    for i in to_visit:
        print i
        visited.add(i)
        if (i == (i/3)*3):
            add_to_gen((i+1)*4)
        print "to visit = %s" % to_visit
        print "visited = %s" %visited
    
main1()
main2()
