class iter2(object): '''Takes in an object that is iterable. Allows for the following method calls (that should be built into iterators anyway...) calls: - append - appends another iterable onto the iterator. - insert - only accepts inserting at the 0 place, inserts an iterable before other iterables. - adding. an iter2 object can be added to another object that is iterable. i.e. iter2 + iter (not iter + iter2). It's best to make all objects iter2 objects to avoid syntax errors. :D ''' def __init__(self, iterable): self._iter = iter(iterable) def append(self, iterable): self._iter = itertools.chain(self._iter, iter(iterable)) def insert(self, place, iterable): if place != 0: raise ValueError('Can only insert at index of 0') self._iter = itertools.chain(iter(iterable), self._iter) def __add__(self, iterable): return itertools.chain(self._iter, iter(iterable)) def next(self): return self._iter.next() def __iter__(self): return self def flatten(iterable): '''flatten a list of any depth''' iterable = iter2(iterable) for e in iterable: if hasattr(e, '__iter__'): iterable.insert(0, e) else: yield e