14acc25bd392216c4f867a10ca8081e7c8a739676Guido van Rossum"""A more or less complete user-defined wrapper around list objects."""
2ae3b3a33d85134b51505b3f0f3fdaf6afbffa79bGuido van Rossum
3882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettingerimport collections
4882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettinger
5882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettingerclass UserList(collections.MutableSequence):
66a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton    def __init__(self, initlist=None):
72a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        self.data = []
86a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton        if initlist is not None:
97e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters            # XXX should this accept an arbitrary sequence?
106a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton            if type(initlist) == type(self.data):
116a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton                self.data[:] = initlist
126a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton            elif isinstance(initlist, UserList):
136a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton                self.data[:] = initlist.data[:]
142a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            else:
156a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton                self.data = list(initlist)
162a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __repr__(self): return repr(self.data)
17753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __lt__(self, other): return self.data <  self.__cast(other)
18753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __le__(self, other): return self.data <= self.__cast(other)
19753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __eq__(self, other): return self.data == self.__cast(other)
20753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __ne__(self, other): return self.data != self.__cast(other)
21753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __gt__(self, other): return self.data >  self.__cast(other)
22753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __ge__(self, other): return self.data >= self.__cast(other)
23753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum    def __cast(self, other):
24753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum        if isinstance(other, UserList): return other.data
25753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum        else: return other
262a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __cmp__(self, other):
270163d6d6ef85dd0cd0ea4ea6dce4b867e39cd6b9Martin v. Löwis        return cmp(self.data, self.__cast(other))
2848361f5cbf419cce361fd1aa0389d6304ad167dbNick Coghlan    __hash__ = None # Mutable sequence, so not hashable
297b393fc0379d901da657e8fb870171cca71f94f4Tim Peters    def __contains__(self, item): return item in self.data
302a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __len__(self): return len(self.data)
312a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __getitem__(self, i): return self.data[i]
322a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __setitem__(self, i, item): self.data[i] = item
332a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __delitem__(self, i): del self.data[i]
342a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __getslice__(self, i, j):
352a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        i = max(i, 0); j = max(j, 0)
36cc773d3b11967b36684b0681e54ed6388bf7370cFred Drake        return self.__class__(self.data[i:j])
372a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __setslice__(self, i, j, other):
382a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        i = max(i, 0); j = max(j, 0)
392a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        if isinstance(other, UserList):
402a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            self.data[i:j] = other.data
412a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        elif isinstance(other, type(self.data)):
422a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            self.data[i:j] = other
432a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        else:
442a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            self.data[i:j] = list(other)
452a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __delslice__(self, i, j):
462a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        i = max(i, 0); j = max(j, 0)
472a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        del self.data[i:j]
482a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __add__(self, other):
492a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        if isinstance(other, UserList):
502a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(self.data + other.data)
512a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        elif isinstance(other, type(self.data)):
522a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(self.data + other)
532a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        else:
542a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(self.data + list(other))
552a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __radd__(self, other):
562a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        if isinstance(other, UserList):
572a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(other.data + self.data)
582a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        elif isinstance(other, type(self.data)):
592a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(other + self.data)
602a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        else:
612a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            return self.__class__(list(other) + self.data)
62104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters    def __iadd__(self, other):
63104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        if isinstance(other, UserList):
64104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters            self.data += other.data
65104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        elif isinstance(other, type(self.data)):
66104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters            self.data += other
67104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        else:
68104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters            self.data += list(other)
69104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        return self
702a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def __mul__(self, n):
712a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        return self.__class__(self.data*n)
722a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    __rmul__ = __mul__
73104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters    def __imul__(self, n):
74104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        self.data *= n
75104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters        return self
762a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def append(self, item): self.data.append(item)
772a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def insert(self, i, item): self.data.insert(i, item)
782a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def pop(self, i=-1): return self.data.pop(i)
792a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def remove(self, item): self.data.remove(item)
802a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def count(self, item): return self.data.count(item)
81d05abdec7b2620449369bb44a617684463ba50acRaymond Hettinger    def index(self, item, *args): return self.data.index(item, *args)
822a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def reverse(self): self.data.reverse()
836b59f5f3fd9bdf00875a7cead15f423fa1c2f910Raymond Hettinger    def sort(self, *args, **kwds): self.data.sort(*args, **kwds)
842a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum    def extend(self, other):
852a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        if isinstance(other, UserList):
862a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            self.data.extend(other.data)
872a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum        else:
882a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum            self.data.extend(other)
89