Третий коммит, добавление share, share_kb, а также ADMIN_ID

This commit is contained in:
2025-07-22 13:50:14 +03:00
parent 849feb7beb
commit b98123f4dc
1479 changed files with 323549 additions and 11 deletions

View File

@@ -0,0 +1,86 @@
import os
import types
from collections.abc import MutableSequence
from functools import total_ordering
__version__ = "1.7.0"
__all__ = ("FrozenList", "PyFrozenList") # type: Tuple[str, ...]
NO_EXTENSIONS = bool(os.environ.get("FROZENLIST_NO_EXTENSIONS")) # type: bool
@total_ordering
class FrozenList(MutableSequence):
__slots__ = ("_frozen", "_items")
__class_getitem__ = classmethod(types.GenericAlias)
def __init__(self, items=None):
self._frozen = False
if items is not None:
items = list(items)
else:
items = []
self._items = items
@property
def frozen(self):
return self._frozen
def freeze(self):
self._frozen = True
def __getitem__(self, index):
return self._items[index]
def __setitem__(self, index, value):
if self._frozen:
raise RuntimeError("Cannot modify frozen list.")
self._items[index] = value
def __delitem__(self, index):
if self._frozen:
raise RuntimeError("Cannot modify frozen list.")
del self._items[index]
def __len__(self):
return self._items.__len__()
def __iter__(self):
return self._items.__iter__()
def __reversed__(self):
return self._items.__reversed__()
def __eq__(self, other):
return list(self) == other
def __le__(self, other):
return list(self) <= other
def insert(self, pos, item):
if self._frozen:
raise RuntimeError("Cannot modify frozen list.")
self._items.insert(pos, item)
def __repr__(self):
return f"<FrozenList(frozen={self._frozen}, {self._items!r})>"
def __hash__(self):
if self._frozen:
return hash(tuple(self))
else:
raise RuntimeError("Cannot hash unfrozen list.")
PyFrozenList = FrozenList
if not NO_EXTENSIONS:
try:
from ._frozenlist import FrozenList as CFrozenList # type: ignore
except ImportError: # pragma: no cover
pass
else:
FrozenList = CFrozenList # type: ignore

View File

@@ -0,0 +1,47 @@
from typing import (
Generic,
Iterable,
Iterator,
List,
MutableSequence,
Optional,
TypeVar,
Union,
overload,
)
_T = TypeVar("_T")
_Arg = Union[List[_T], Iterable[_T]]
class FrozenList(MutableSequence[_T], Generic[_T]):
def __init__(self, items: Optional[_Arg[_T]] = None) -> None: ...
@property
def frozen(self) -> bool: ...
def freeze(self) -> None: ...
@overload
def __getitem__(self, i: int) -> _T: ...
@overload
def __getitem__(self, s: slice) -> FrozenList[_T]: ...
@overload
def __setitem__(self, i: int, o: _T) -> None: ...
@overload
def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
@overload
def __delitem__(self, i: int) -> None: ...
@overload
def __delitem__(self, i: slice) -> None: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[_T]: ...
def __reversed__(self) -> Iterator[_T]: ...
def __eq__(self, other: object) -> bool: ...
def __le__(self, other: FrozenList[_T]) -> bool: ...
def __ne__(self, other: object) -> bool: ...
def __lt__(self, other: FrozenList[_T]) -> bool: ...
def __ge__(self, other: FrozenList[_T]) -> bool: ...
def __gt__(self, other: FrozenList[_T]) -> bool: ...
def insert(self, pos: int, item: _T) -> None: ...
def __repr__(self) -> str: ...
def __hash__(self) -> int: ...
# types for C accelerators are the same
CFrozenList = PyFrozenList = FrozenList

View File

@@ -0,0 +1,148 @@
# cython: freethreading_compatible = True
# distutils: language = c++
from cpython.bool cimport PyBool_FromLong
from libcpp.atomic cimport atomic
import copy
import types
from collections.abc import MutableSequence
cdef class FrozenList:
__class_getitem__ = classmethod(types.GenericAlias)
cdef atomic[bint] _frozen
cdef list _items
def __init__(self, items=None):
self._frozen.store(False)
if items is not None:
items = list(items)
else:
items = []
self._items = items
@property
def frozen(self):
return PyBool_FromLong(self._frozen.load())
cdef object _check_frozen(self):
if self._frozen.load():
raise RuntimeError("Cannot modify frozen list.")
cdef inline object _fast_len(self):
return len(self._items)
def freeze(self):
self._frozen.store(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.load(),
self._items)
def __hash__(self):
if self._frozen.load():
return hash(tuple(self._items))
else:
raise RuntimeError("Cannot hash unfrozen list.")
def __deepcopy__(self, memo):
cdef FrozenList new_list
obj_id = id(self)
# Return existing copy if already processed (circular reference)
if obj_id in memo:
return memo[obj_id]
# Create new instance and register immediately
new_list = self.__class__([])
memo[obj_id] = new_list
# Deep copy items
new_list._items[:] = [copy.deepcopy(item, memo) for item in self._items]
# Preserve frozen state
if self._frozen.load():
new_list.freeze()
return new_list
MutableSequence.register(FrozenList)

View File

@@ -0,0 +1 @@
Marker