download: circular.py
class Circular(list):
    
    def __init__(self, sequence):
        list.__init__(self, sequence)
        self.i = 0
            
    def set_index(self, i):
        if i not in range(len(self)):
	    raise IndexError, 'Can\'t set index out of range'
	else:
	    self.i = i
            
    def next(self, n=1):
        if self == []:
	    return None
	if n < 0:
	    return self.prev(abs(n))    
	if self.i not in range(len(self)):
	    self.i = len(self) - 1 
	if self.i + n >= len(self):
	    i = self.i
            self.set_index(0)
            return self.next(n - len(self) + i)
	else:
            self.set_index(self.i + n)
            return self[self.i]
            
    def prev(self, n=1):
        if self == []:
            return None
	if n < 0:
	    return self.next(abs(n))
	if self.i not in range(len(self)):
	    self.i = len(self) - 1 
	if self.i - n < 0:
            i = self.i
            self.set_index(len(self) - 1)
            return self.prev(n - i - 1)
        else:
            self.i -= n
            return self[self.i]


if __name__ == '__main__':
	
    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.set_index(5)
    print a.pop()
    print a.next()
    print a.next(88)
    print a.next(-2)
    print a.next(-9)


Copyleft 2006 Juanjo Conti