download: circular-r2.py
class Circular(list):
def __init__(self, sequence):
list.__init__(self, sequence)
self.i = 0
def _not_in_range(self, i):
return i < 0 or i >= len(self)
def set_index(self, i):
if self._not_in_range(i):
raise IndexError, 'Can\'t set index out of range'
else:
self.i = i
def get_index(self):
if self._not_in_range(self.i):
self.i = len(self) - 1
return self.i
def next(self, n=1):
if self == []:
raise Exception, 'There are no items'
if n < 0:
return self.prev(abs(n))
if self._not_in_range(self.i):
self.i = len(self) - 1
if n >= len(self):
n = n % len(self)
try:
self.set_index(self.i + n)
return self[self.i]
except IndexError:
self.set_index(self.i + n - len(self))
return self[self.i]
def prev(self, n=1):
if self == []:
raise Exception, 'There are no items'
if n < 0:
return self.next(abs(n))
if self._not_in_range(self.i):
self.i = len(self) - 1
if n >= len(self):
n = n % len(self)
i = self.i - n
if i >= 0:
self.set_index(i)
else:
self.set_index(len(self) + i)
return self[self.i]
if __name__ == '__main__':
'''Estas pruebas deberian organizarse con algun paquete de prueba de unidad'''
seq = (1, 2, 3, 15, "www", 'u')
a = Circular(seq)
for j in range(10):
print a.next(), a.i
for j in range(10):
print a.prev(), a.i
for j in range(10):
print a.next(2), a.i
for j in range(10):
print a.prev(2), a.i
for j in range(15):
print a.next(7), a.i
for j in range(15):
print a.prev(7), a.i
a += ['u']
a.set_index(5)
print a.get_index() == 5
print a.pop() == 'u'
print a.next() == 1
print a.next(8) == 3
print a.next(-2) == 1
print a.next(-9) == 15
b = Circular(a)
a.set_index(4)
b.set_index(4)
print a.next(3) == b.prev(len(b) - 3)