[ create a new paste ] login | about

Link: http://codepad.org/WodYoClk    [ raw code | output | fork ]

Python, pasted on Apr 30:
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


Output:
1
done


Create a new paste based on this one


Comments: