109 lines
2.5 KiB
Cython
109 lines
2.5 KiB
Cython
from collections.abc import MutableSequence
|
|
|
|
|
|
cdef class FrozenList:
|
|
|
|
cdef readonly bint frozen
|
|
cdef list _items
|
|
|
|
def __init__(self, items=None):
|
|
self.frozen = False
|
|
if items is not None:
|
|
items = list(items)
|
|
else:
|
|
items = []
|
|
self._items = items
|
|
|
|
cdef object _check_frozen(self):
|
|
if self.frozen:
|
|
raise RuntimeError("Cannot modify frozen list.")
|
|
|
|
cdef inline object _fast_len(self):
|
|
return len(self._items)
|
|
|
|
def freeze(self):
|
|
self.frozen = True
|
|
|
|
def __getitem__(self, index):
|
|
return self._items[index]
|
|
|
|
def __setitem__(self, index, value):
|
|
self._check_frozen()
|
|
self._items[index] = value
|
|
|
|
def __delitem__(self, index):
|
|
self._check_frozen()
|
|
del self._items[index]
|
|
|
|
def __len__(self):
|
|
return self._fast_len()
|
|
|
|
def __iter__(self):
|
|
return self._items.__iter__()
|
|
|
|
def __reversed__(self):
|
|
return self._items.__reversed__()
|
|
|
|
def __richcmp__(self, other, op):
|
|
if op == 0: # <
|
|
return list(self) < other
|
|
if op == 1: # <=
|
|
return list(self) <= other
|
|
if op == 2: # ==
|
|
return list(self) == other
|
|
if op == 3: # !=
|
|
return list(self) != other
|
|
if op == 4: # >
|
|
return list(self) > other
|
|
if op == 5: # =>
|
|
return list(self) >= other
|
|
|
|
def insert(self, pos, item):
|
|
self._check_frozen()
|
|
self._items.insert(pos, item)
|
|
|
|
def __contains__(self, item):
|
|
return item in self._items
|
|
|
|
def __iadd__(self, items):
|
|
self._check_frozen()
|
|
self._items += list(items)
|
|
return self
|
|
|
|
def index(self, item):
|
|
return self._items.index(item)
|
|
|
|
def remove(self, item):
|
|
self._check_frozen()
|
|
self._items.remove(item)
|
|
|
|
def clear(self):
|
|
self._check_frozen()
|
|
self._items.clear()
|
|
|
|
def extend(self, items):
|
|
self._check_frozen()
|
|
self._items += list(items)
|
|
|
|
def reverse(self):
|
|
self._check_frozen()
|
|
self._items.reverse()
|
|
|
|
def pop(self, index=-1):
|
|
self._check_frozen()
|
|
return self._items.pop(index)
|
|
|
|
def append(self, item):
|
|
self._check_frozen()
|
|
return self._items.append(item)
|
|
|
|
def count(self, item):
|
|
return self._items.count(item)
|
|
|
|
def __repr__(self):
|
|
return '<FrozenList(frozen={}, {!r})>'.format(self.frozen,
|
|
self._items)
|
|
|
|
|
|
MutableSequence.register(FrozenList)
|