88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
#!/usr/bin/env python
|
|
|
|
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
__version__ = "0.2"
|
|
__license__ = "GNU Lesser General Public License"
|
|
__package__ = "lastfm.util"
|
|
|
|
import sys
|
|
class SafeList(object):
|
|
def __init__(self, lst, add_func, remove_func):
|
|
self._list = lst
|
|
self._add_func = add_func
|
|
self._remove_func = remove_func
|
|
|
|
def add(self, lst):
|
|
if not isinstance(lst, (list, tuple)):
|
|
lst = [lst]
|
|
self._add_func(lst)
|
|
|
|
def remove(self, lst):
|
|
if not isinstance(lst, (list, tuple)):
|
|
lst = [lst]
|
|
for l in lst:
|
|
self._remove_func(l)
|
|
|
|
def __iter__(self):
|
|
for i in xrange(len(self._list)):
|
|
yield self._list[i]
|
|
|
|
def _tuple_from_slice(self, i):
|
|
"""
|
|
Get (start, end, step) tuple from slice object.
|
|
"""
|
|
(start, end, step) = i.indices(len(self._list))
|
|
# Replace (0, -1, 1) with (0, 0, 1) (misfeature in .indices()).
|
|
if step == 1:
|
|
if end < start:
|
|
end = start
|
|
step = None
|
|
if i.step == None:
|
|
step = None
|
|
return (start, end, step)
|
|
|
|
|
|
def __getitem__(self, i):
|
|
if isinstance(i, slice):
|
|
(start, end, step) = self._tuple_from_slice(i)
|
|
if step == None:
|
|
indices = xrange(start, end)
|
|
else:
|
|
indices = xrange(start, end, step)
|
|
return [self._list[i] for i in indices]
|
|
else:
|
|
return self._list[i]
|
|
|
|
def index(self, x, i=0, j=None):
|
|
if i != 0 or j is not None:
|
|
(i, j, ignore) = self._tuple_from_slice(slice(i, j))
|
|
if j is None:
|
|
j = len(self)
|
|
for k in xrange(i, j):
|
|
if self._list[k] == x:
|
|
return k
|
|
raise ValueError('index(x): x not in list')
|
|
|
|
# Define sort() as appropriate for the Python version.
|
|
if sys.version_info[:3] < (2, 4, 0):
|
|
def sort(self, cmpfunc=None):
|
|
ans = list(self._list)
|
|
ans.sort(cmpfunc)
|
|
self._list[:] = ans
|
|
else:
|
|
def sort(self, cmpfunc=None, key=None, reverse=False):
|
|
ans = list(self._list)
|
|
if reverse == True:
|
|
ans.sort(cmpfunc, key, reverse)
|
|
elif key != None:
|
|
ans.sort(cmpfunc, key)
|
|
else:
|
|
ans.sort(cmpfunc)
|
|
self._list[:] = ans
|
|
|
|
def __len__(self):
|
|
return len(self._list)
|
|
|
|
def __repr__(self):
|
|
return repr(self._list)
|