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)