You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.5 KiB

4 years ago
  1. from collections.abc import MutableSequence
  2. cdef class FrozenList:
  3. cdef readonly bint frozen
  4. cdef list _items
  5. def __init__(self, items=None):
  6. self.frozen = False
  7. if items is not None:
  8. items = list(items)
  9. else:
  10. items = []
  11. self._items = items
  12. cdef object _check_frozen(self):
  13. if self.frozen:
  14. raise RuntimeError("Cannot modify frozen list.")
  15. cdef inline object _fast_len(self):
  16. return len(self._items)
  17. def freeze(self):
  18. self.frozen = True
  19. def __getitem__(self, index):
  20. return self._items[index]
  21. def __setitem__(self, index, value):
  22. self._check_frozen()
  23. self._items[index] = value
  24. def __delitem__(self, index):
  25. self._check_frozen()
  26. del self._items[index]
  27. def __len__(self):
  28. return self._fast_len()
  29. def __iter__(self):
  30. return self._items.__iter__()
  31. def __reversed__(self):
  32. return self._items.__reversed__()
  33. def __richcmp__(self, other, op):
  34. if op == 0: # <
  35. return list(self) < other
  36. if op == 1: # <=
  37. return list(self) <= other
  38. if op == 2: # ==
  39. return list(self) == other
  40. if op == 3: # !=
  41. return list(self) != other
  42. if op == 4: # >
  43. return list(self) > other
  44. if op == 5: # =>
  45. return list(self) >= other
  46. def insert(self, pos, item):
  47. self._check_frozen()
  48. self._items.insert(pos, item)
  49. def __contains__(self, item):
  50. return item in self._items
  51. def __iadd__(self, items):
  52. self._check_frozen()
  53. self._items += list(items)
  54. return self
  55. def index(self, item):
  56. return self._items.index(item)
  57. def remove(self, item):
  58. self._check_frozen()
  59. self._items.remove(item)
  60. def clear(self):
  61. self._check_frozen()
  62. self._items.clear()
  63. def extend(self, items):
  64. self._check_frozen()
  65. self._items += list(items)
  66. def reverse(self):
  67. self._check_frozen()
  68. self._items.reverse()
  69. def pop(self, index=-1):
  70. self._check_frozen()
  71. return self._items.pop(index)
  72. def append(self, item):
  73. self._check_frozen()
  74. return self._items.append(item)
  75. def count(self, item):
  76. return self._items.count(item)
  77. def __repr__(self):
  78. return '<FrozenList(frozen={}, {!r})>'.format(self.frozen,
  79. self._items)
  80. MutableSequence.register(FrozenList)