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)


Copyleft 2006 Juanjo Conti