Spaces:
Runtime error
Runtime error
import sys | |
import types | |
from collections.abc import MutableSequence | |
cdef class FrozenList: | |
if sys.version_info >= (3, 9): | |
__class_getitem__ = classmethod(types.GenericAlias) | |
else: | |
def __class_getitem__(cls): | |
return cls | |
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) | |
def __hash__(self): | |
if self.frozen: | |
return hash(tuple(self._items)) | |
else: | |
raise RuntimeError("Cannot hash unfrozen list.") | |
MutableSequence.register(FrozenList) | |