class _Wrapper(object):
def __init__(self, object):
self.object = object
class StableIterationContainer(object):
def __init__(self, source):
self._contents = []
for i in source:
self.append(i)
def __iter__(self):
return StableIterator(self)
def _wrap(self, i):
return _Wrapper(i)
def _unwrap(self, wrapper):
return wrapper.object
def append(self, i):
wrapped = self._wrap(i)
self._contents.append(wrapped)
def reverse(self):
self._contents.reverse()
def __getitem__(self, index):
i = self._contents[index]
return self._unwrap(i)
class _AlreadySeen(Exception):
pass
class StableIterator(object):
def __init__(self, container):
self.container = container
self.seen = []
def next(self):
for wrapper in self.container._contents:
try:
for seen in self.seen:
if wrapper is seen:
raise _AlreadySeen()
self.seen.append(wrapper)
return wrapper.object
except _AlreadySeen:
pass
raise StopIteration()
if __name__ == '__main__':
c = StableIterationContainer(range(1, 5))
assert list(c) == [1, 2, 3, 4]
i = iter(c)
assert i.next() == 1
assert i.next() == 2
c.reverse()
assert i.next() == 4
assert i.next() == 3
print "done"
# End of File