codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
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
Private
[
?
]
Run code
Submit