datahold 4.0.0.dev10__tar.gz → 4.0.0.dev20__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/PKG-INFO +1 -1
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/pyproject.toml +1 -1
- datahold-4.0.0.dev20/src/datahold/__init__.py +468 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/PKG-INFO +1 -1
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/SOURCES.txt +1 -0
- datahold-4.0.0.dev20/tests/test_prefix.py +41 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/testdata.toml +35 -15
- datahold-4.0.0.dev10/src/datahold/__init__.py +0 -258
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/README.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v4.0.rst +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/run_tests.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/setup.cfg +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/requires.txt +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/top_level.txt +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_FrozenListSlot.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_MutableListHold.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_abstractmethods.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_all.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_attributes.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_docs.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_generic.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_internal_comparison.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_issubclass.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_nested.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_sorted.py +0 -0
- {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_variance.py +0 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
"""Provide provides base classes for customized collections."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__: list[str] = [
|
|
6
|
+
"Collection",
|
|
7
|
+
"FrozenListLike",
|
|
8
|
+
"FrozenListSlot",
|
|
9
|
+
"ListLike",
|
|
10
|
+
"ListSlot",
|
|
11
|
+
"MutableListLike",
|
|
12
|
+
"MutableListSlot",
|
|
13
|
+
"MutableSequence",
|
|
14
|
+
"Sequence",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
from abc import abstractmethod
|
|
18
|
+
from collections import abc
|
|
19
|
+
from contextlib import contextmanager
|
|
20
|
+
from types import NotImplementedType, TracebackType
|
|
21
|
+
from typing import (
|
|
22
|
+
Any,
|
|
23
|
+
Never,
|
|
24
|
+
Optional,
|
|
25
|
+
Protocol,
|
|
26
|
+
Self,
|
|
27
|
+
SupportsIndex,
|
|
28
|
+
overload,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
import setdoc
|
|
32
|
+
|
|
33
|
+
### UTILS ###
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ContextManager[Enter](Protocol):
|
|
37
|
+
"""Provide context manager protocol."""
|
|
38
|
+
|
|
39
|
+
@setdoc.basic
|
|
40
|
+
def __enter__(self: Self, /) -> Enter: ...
|
|
41
|
+
|
|
42
|
+
@setdoc.basic
|
|
43
|
+
def __exit__(
|
|
44
|
+
self: Self,
|
|
45
|
+
exc_type: type[BaseException] | None,
|
|
46
|
+
exc_value: BaseException | None,
|
|
47
|
+
traceback: TracebackType | None,
|
|
48
|
+
/,
|
|
49
|
+
) -> object: ...
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
type Slice[Index] = slice[Optional[Index], Optional[Index], Optional[Index]]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### COLLECTION ###
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class Collection[Item](
|
|
59
|
+
abc.Sized,
|
|
60
|
+
abc.Iterable[Item],
|
|
61
|
+
abc.Container[object],
|
|
62
|
+
):
|
|
63
|
+
"""Provide abc for custom collections."""
|
|
64
|
+
|
|
65
|
+
@setdoc.basic
|
|
66
|
+
class __Frozen__[FrozenItem](
|
|
67
|
+
abc.Sized,
|
|
68
|
+
abc.Iterable[FrozenItem],
|
|
69
|
+
Protocol,
|
|
70
|
+
):
|
|
71
|
+
@setdoc.basic
|
|
72
|
+
def __contains__(self: Self, other: Never, /) -> bool: ...
|
|
73
|
+
|
|
74
|
+
@setdoc.basic
|
|
75
|
+
def __contains__(self: Self, other: object, /) -> bool:
|
|
76
|
+
try:
|
|
77
|
+
return other in self.__frozen__() # type: ignore[operator]
|
|
78
|
+
except TypeError:
|
|
79
|
+
return other in (x for x in self) # type: ignore[operator]
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
@setdoc.basic
|
|
83
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
84
|
+
|
|
85
|
+
@setdoc.basic
|
|
86
|
+
def __iter__(self: Self) -> abc.Iterator[Item]:
|
|
87
|
+
return iter(self.__frozen__())
|
|
88
|
+
|
|
89
|
+
@setdoc.basic
|
|
90
|
+
def __len__(self: Self, /) -> int:
|
|
91
|
+
return len(self.__frozen__())
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
### SEQUENCE ###
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Sequence[Item](Collection[Item], abc.Sequence[Item]):
|
|
98
|
+
"""Provide a base class for customized sequence."""
|
|
99
|
+
|
|
100
|
+
__slots__ = ()
|
|
101
|
+
|
|
102
|
+
@setdoc.basic
|
|
103
|
+
class __Frozen__[FrozenItem](
|
|
104
|
+
Collection.__Frozen__[FrozenItem],
|
|
105
|
+
Protocol,
|
|
106
|
+
):
|
|
107
|
+
@overload
|
|
108
|
+
@setdoc.basic
|
|
109
|
+
def __getitem__(self: Self, key: int, /) -> FrozenItem: ...
|
|
110
|
+
@overload
|
|
111
|
+
@setdoc.basic
|
|
112
|
+
def __getitem__(
|
|
113
|
+
self: Self, key: Slice[int], /
|
|
114
|
+
) -> abc.Sequence[FrozenItem]: ...
|
|
115
|
+
@setdoc.basic
|
|
116
|
+
def __getitem__(
|
|
117
|
+
self: Self,
|
|
118
|
+
key: int | Slice[int],
|
|
119
|
+
/,
|
|
120
|
+
) -> FrozenItem | abc.Sequence[FrozenItem]: ...
|
|
121
|
+
|
|
122
|
+
@abstractmethod
|
|
123
|
+
@setdoc.basic
|
|
124
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
125
|
+
|
|
126
|
+
@overload
|
|
127
|
+
@setdoc.basic
|
|
128
|
+
def __getitem__(self: Self, key: int, /) -> Item: ...
|
|
129
|
+
@overload
|
|
130
|
+
@setdoc.basic
|
|
131
|
+
def __getitem__(self: Self, key: Slice[int], /) -> abc.Sequence[Item]: ...
|
|
132
|
+
@setdoc.basic
|
|
133
|
+
def __getitem__(
|
|
134
|
+
self: Self, key: int | Slice[int], /
|
|
135
|
+
) -> Item | abc.Sequence[Item]:
|
|
136
|
+
return self.__frozen__()[key]
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class MutableSequence[Item](Sequence[Item], abc.MutableSequence[Item]):
|
|
140
|
+
"""Provide a base class for customized mutable list-likes."""
|
|
141
|
+
|
|
142
|
+
__slots__ = ()
|
|
143
|
+
|
|
144
|
+
@setdoc.basic
|
|
145
|
+
class __Mutable__[MutableItem](Protocol):
|
|
146
|
+
|
|
147
|
+
@overload
|
|
148
|
+
@setdoc.basic
|
|
149
|
+
def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
|
|
150
|
+
@overload
|
|
151
|
+
@setdoc.basic
|
|
152
|
+
def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
|
|
153
|
+
@setdoc.basic
|
|
154
|
+
def __delitem__(
|
|
155
|
+
self: Self, key: SupportsIndex | Slice[SupportsIndex], /
|
|
156
|
+
) -> None: ...
|
|
157
|
+
|
|
158
|
+
@overload
|
|
159
|
+
@setdoc.basic
|
|
160
|
+
def __getitem__(self: Self, key: int, /) -> MutableItem: ...
|
|
161
|
+
@overload
|
|
162
|
+
@setdoc.basic
|
|
163
|
+
def __getitem__(
|
|
164
|
+
self: Self, key: Slice[int], /
|
|
165
|
+
) -> abc.MutableSequence[MutableItem]: ...
|
|
166
|
+
@setdoc.basic
|
|
167
|
+
def __getitem__(
|
|
168
|
+
self: Self,
|
|
169
|
+
key: int | Slice[int],
|
|
170
|
+
/,
|
|
171
|
+
) -> MutableItem | abc.MutableSequence[MutableItem]: ...
|
|
172
|
+
|
|
173
|
+
@overload
|
|
174
|
+
@setdoc.basic
|
|
175
|
+
def __setitem__(
|
|
176
|
+
self: Self, key: int, value: MutableItem, /
|
|
177
|
+
) -> None: ...
|
|
178
|
+
@overload
|
|
179
|
+
@setdoc.basic
|
|
180
|
+
def __setitem__(
|
|
181
|
+
self: Self, key: Slice[int], value: abc.Iterable[MutableItem], /
|
|
182
|
+
) -> None: ...
|
|
183
|
+
@setdoc.basic
|
|
184
|
+
def __setitem__(
|
|
185
|
+
self: Self,
|
|
186
|
+
key: int | Slice[int],
|
|
187
|
+
value: MutableItem | abc.Iterable[MutableItem],
|
|
188
|
+
/,
|
|
189
|
+
) -> None: ...
|
|
190
|
+
|
|
191
|
+
@setdoc.basic
|
|
192
|
+
def insert(self: Self, index: int, item: MutableItem, /) -> None: ...
|
|
193
|
+
|
|
194
|
+
@overload
|
|
195
|
+
@setdoc.basic
|
|
196
|
+
def __delitem__(self: Self, key: int, /) -> None: ...
|
|
197
|
+
@overload
|
|
198
|
+
@setdoc.basic
|
|
199
|
+
def __delitem__(self: Self, key: Slice[int], /) -> None: ...
|
|
200
|
+
@setdoc.basic
|
|
201
|
+
def __delitem__(self: Self, key: int | Slice[int], /) -> None:
|
|
202
|
+
with self.__mutate__() as mutable:
|
|
203
|
+
del mutable[key]
|
|
204
|
+
|
|
205
|
+
@overload
|
|
206
|
+
@setdoc.basic
|
|
207
|
+
def __getitem__(self: Self, key: int, /) -> Item: ...
|
|
208
|
+
@overload
|
|
209
|
+
@setdoc.basic
|
|
210
|
+
def __getitem__(
|
|
211
|
+
self: Self, key: Slice[int], /
|
|
212
|
+
) -> abc.MutableSequence[Item]: ...
|
|
213
|
+
@setdoc.basic
|
|
214
|
+
def __getitem__(
|
|
215
|
+
self: Self, key: int | Slice[int], /
|
|
216
|
+
) -> Item | abc.MutableSequence[Item]:
|
|
217
|
+
with self.__mutate__() as mutable:
|
|
218
|
+
return mutable[key]
|
|
219
|
+
|
|
220
|
+
@abstractmethod
|
|
221
|
+
@setdoc.basic
|
|
222
|
+
def __mutate__(self: Self, /) -> ContextManager[__Mutable__[Item]]: ...
|
|
223
|
+
|
|
224
|
+
@overload
|
|
225
|
+
@setdoc.basic
|
|
226
|
+
def __setitem__(self: Self, key: int, value: Item, /) -> None: ...
|
|
227
|
+
@overload
|
|
228
|
+
@setdoc.basic
|
|
229
|
+
def __setitem__(
|
|
230
|
+
self: Self, key: Slice[int], value: abc.Iterable[Item], /
|
|
231
|
+
) -> None: ...
|
|
232
|
+
@setdoc.basic
|
|
233
|
+
def __setitem__(
|
|
234
|
+
self: Self,
|
|
235
|
+
key: int | Slice[int],
|
|
236
|
+
value: Item | abc.Iterable[Item],
|
|
237
|
+
/,
|
|
238
|
+
) -> None:
|
|
239
|
+
with self.__mutate__() as mutable:
|
|
240
|
+
mutable[key] = value # type: ignore
|
|
241
|
+
|
|
242
|
+
@setdoc.basic
|
|
243
|
+
def insert(self: Self, index: int, item: Item, /) -> None:
|
|
244
|
+
with self.__mutate__() as mutable:
|
|
245
|
+
mutable.insert(index, item)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
### LIST-LIKE ###
|
|
249
|
+
class ListLike[Item](Sequence[Item]):
|
|
250
|
+
"""Provide a base class for customized list-likes."""
|
|
251
|
+
|
|
252
|
+
__slots__ = ()
|
|
253
|
+
|
|
254
|
+
type __Frozen__[FrozenItem] = tuple[FrozenItem, ...]
|
|
255
|
+
# Frozen has to be tuple to allow covariance
|
|
256
|
+
|
|
257
|
+
type Init[InitItem] = abc.Iterable[InitItem]
|
|
258
|
+
|
|
259
|
+
@setdoc.basic
|
|
260
|
+
def __add__[Item_](
|
|
261
|
+
self: Self, other: ListLike[Item_], /
|
|
262
|
+
) -> ListLike[Item | Item_]:
|
|
263
|
+
if isinstance(other, ListLike):
|
|
264
|
+
return type(self)(self.__frozen__() + other.__frozen__()) # type: ignore[operator]
|
|
265
|
+
else:
|
|
266
|
+
raise TypeError
|
|
267
|
+
|
|
268
|
+
@setdoc.basic
|
|
269
|
+
def __eq__(self: Self, other: object, /) -> NotImplementedType | bool:
|
|
270
|
+
if isinstance(other, ListLike):
|
|
271
|
+
return self.__frozen__() == other.__frozen__()
|
|
272
|
+
else:
|
|
273
|
+
return NotImplemented
|
|
274
|
+
|
|
275
|
+
@abstractmethod
|
|
276
|
+
@setdoc.basic
|
|
277
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
278
|
+
|
|
279
|
+
@setdoc.basic
|
|
280
|
+
def __ge__(self: Self, other: ListLike[Any], /) -> bool:
|
|
281
|
+
if isinstance(other, ListLike):
|
|
282
|
+
return self.__frozen__() >= other.__frozen__()
|
|
283
|
+
else:
|
|
284
|
+
return NotImplemented
|
|
285
|
+
|
|
286
|
+
@overload
|
|
287
|
+
@setdoc.basic
|
|
288
|
+
def __getitem__(self: Self, key: SupportsIndex, /) -> Item: ...
|
|
289
|
+
|
|
290
|
+
@overload
|
|
291
|
+
@setdoc.basic
|
|
292
|
+
def __getitem__(self: Self, key: Slice[SupportsIndex], /) -> Self: ...
|
|
293
|
+
|
|
294
|
+
@setdoc.basic
|
|
295
|
+
def __getitem__(
|
|
296
|
+
self: Self,
|
|
297
|
+
key: SupportsIndex | Slice[SupportsIndex],
|
|
298
|
+
/,
|
|
299
|
+
) -> Item | Self:
|
|
300
|
+
if isinstance(key, SupportsIndex):
|
|
301
|
+
return self.__frozen__()[key]
|
|
302
|
+
else:
|
|
303
|
+
return type(self)(self.__frozen__()[key])
|
|
304
|
+
|
|
305
|
+
@setdoc.basic
|
|
306
|
+
def __gt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
307
|
+
if isinstance(other, ListLike):
|
|
308
|
+
return self.__frozen__() > other.__frozen__()
|
|
309
|
+
else:
|
|
310
|
+
return NotImplemented
|
|
311
|
+
|
|
312
|
+
@abstractmethod
|
|
313
|
+
@setdoc.basic
|
|
314
|
+
def __init__(self: Self, data: Init[Item] = (), /) -> None: ...
|
|
315
|
+
|
|
316
|
+
@setdoc.basic
|
|
317
|
+
def __le__(self: Self, other: ListLike[Any], /) -> bool:
|
|
318
|
+
if isinstance(other, ListLike):
|
|
319
|
+
return self.__frozen__() <= other.__frozen__()
|
|
320
|
+
else:
|
|
321
|
+
return NotImplemented
|
|
322
|
+
|
|
323
|
+
@setdoc.basic
|
|
324
|
+
def __lt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
325
|
+
if isinstance(other, ListLike):
|
|
326
|
+
return self.__frozen__() < other.__frozen__()
|
|
327
|
+
else:
|
|
328
|
+
return NotImplemented
|
|
329
|
+
|
|
330
|
+
@setdoc.basic
|
|
331
|
+
def __mul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
332
|
+
if isinstance(other, SupportsIndex):
|
|
333
|
+
return type(self)(self.__frozen__() * other)
|
|
334
|
+
else:
|
|
335
|
+
raise TypeError
|
|
336
|
+
|
|
337
|
+
__rmul__ = __mul__
|
|
338
|
+
|
|
339
|
+
@setdoc.basic
|
|
340
|
+
def __repr__(self: Self, /) -> str:
|
|
341
|
+
return f"{type(self).__name__}({list(self)!r})"
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class FrozenListLike[Item](ListLike[Item], abc.Hashable):
|
|
345
|
+
"""Provide a base class for customized frozen list-likes."""
|
|
346
|
+
|
|
347
|
+
__slots__ = ()
|
|
348
|
+
|
|
349
|
+
@setdoc.basic
|
|
350
|
+
def __hash__(self: Self) -> int:
|
|
351
|
+
return hash(self.__frozen__())
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
class MutableListLike[Item](ListLike[Item], MutableSequence[Item]):
|
|
355
|
+
"""Provide a base class for customized mutable list-likes."""
|
|
356
|
+
|
|
357
|
+
__slots__ = ()
|
|
358
|
+
|
|
359
|
+
type __Mutable__[MutableItem] = list[MutableItem]
|
|
360
|
+
|
|
361
|
+
@overload
|
|
362
|
+
@setdoc.basic
|
|
363
|
+
def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
|
|
364
|
+
@overload
|
|
365
|
+
@setdoc.basic
|
|
366
|
+
def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
|
|
367
|
+
@setdoc.basic
|
|
368
|
+
def __delitem__(
|
|
369
|
+
self: Self, key: SupportsIndex | Slice[SupportsIndex], /
|
|
370
|
+
) -> None:
|
|
371
|
+
with self.__mutate__() as mutable:
|
|
372
|
+
del mutable[key]
|
|
373
|
+
|
|
374
|
+
@setdoc.basic
|
|
375
|
+
def __frozen__(self: Self) -> MutableListLike.__Frozen__[Item]:
|
|
376
|
+
with self.__mutate__() as mutable:
|
|
377
|
+
return tuple(mutable)
|
|
378
|
+
|
|
379
|
+
@setdoc.basic
|
|
380
|
+
def __imul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
381
|
+
with self.__mutate__() as mutable:
|
|
382
|
+
mutable *= other
|
|
383
|
+
return self
|
|
384
|
+
|
|
385
|
+
@setdoc.basic
|
|
386
|
+
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
387
|
+
with self.__mutate__() as mutable:
|
|
388
|
+
mutable.extend(data)
|
|
389
|
+
|
|
390
|
+
@abstractmethod
|
|
391
|
+
@setdoc.basic
|
|
392
|
+
def __mutate__(self: Self, /) -> ContextManager[__Mutable__[Item]]: ...
|
|
393
|
+
|
|
394
|
+
@overload
|
|
395
|
+
@setdoc.basic
|
|
396
|
+
def __setitem__(
|
|
397
|
+
self: Self, key: SupportsIndex, value: Item, /
|
|
398
|
+
) -> None: ...
|
|
399
|
+
@overload
|
|
400
|
+
@setdoc.basic
|
|
401
|
+
def __setitem__(
|
|
402
|
+
self: Self, key: Slice[SupportsIndex], value: abc.Iterable[Item], /
|
|
403
|
+
) -> None: ...
|
|
404
|
+
@setdoc.basic
|
|
405
|
+
def __setitem__(
|
|
406
|
+
self: Self,
|
|
407
|
+
key: SupportsIndex | Slice[SupportsIndex],
|
|
408
|
+
value: Item | abc.Iterable[Item],
|
|
409
|
+
/,
|
|
410
|
+
) -> None:
|
|
411
|
+
with self.__mutate__() as mutable:
|
|
412
|
+
mutable[key] = value # type: ignore
|
|
413
|
+
|
|
414
|
+
@setdoc.basic
|
|
415
|
+
def copy(self: Self) -> Self:
|
|
416
|
+
return type(self)(self)
|
|
417
|
+
|
|
418
|
+
@setdoc.basic
|
|
419
|
+
def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
|
|
420
|
+
with self.__mutate__() as mutable:
|
|
421
|
+
mutable.insert(index, item)
|
|
422
|
+
|
|
423
|
+
@setdoc.basic
|
|
424
|
+
def sort(self: Self, /, *, key: Any = None, reverse: bool = False) -> None:
|
|
425
|
+
# list.sort reveals Overload(
|
|
426
|
+
# def [_T, SupportsRichComparisonT <: _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any]] (self: list[SupportsRichComparisonT], *, key: None =, reverse: bool =),
|
|
427
|
+
# def [_T] (self: list[_T], *, key: def (_T) -> _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any], reverse: bool =),
|
|
428
|
+
# )
|
|
429
|
+
with self.__mutate__() as mutable:
|
|
430
|
+
mutable.sort(key=key, reverse=reverse)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
### LIST-SLOT ###
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class ListSlot[Item](ListLike[Item]):
|
|
437
|
+
"""Provide slotted list-like class."""
|
|
438
|
+
|
|
439
|
+
__slots__ = ("_slot",)
|
|
440
|
+
|
|
441
|
+
_slot: ListSlot.__Frozen__[Item]
|
|
442
|
+
|
|
443
|
+
@setdoc.basic
|
|
444
|
+
def __frozen__(self: Self) -> ListSlot.__Frozen__[Item]:
|
|
445
|
+
return self._slot
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
class FrozenListSlot[Item](ListSlot[Item], FrozenListLike[Item]):
|
|
449
|
+
"""Provide a base class for customized frozen data-holds."""
|
|
450
|
+
|
|
451
|
+
__slots__ = ()
|
|
452
|
+
|
|
453
|
+
@setdoc.basic
|
|
454
|
+
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
455
|
+
self._slot = tuple(data)
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
class MutableListSlot[Item](ListSlot[Item], MutableListLike[Item]):
|
|
459
|
+
"""Provide slotted mutable list-like class."""
|
|
460
|
+
|
|
461
|
+
__slots__ = ()
|
|
462
|
+
|
|
463
|
+
@contextmanager
|
|
464
|
+
@setdoc.basic
|
|
465
|
+
def __mutate__(self: Self, /) -> abc.Generator[list[Item], None, None]:
|
|
466
|
+
slot = list(getattr(self, "_slot", ()))
|
|
467
|
+
yield slot
|
|
468
|
+
self._slot = tuple(slot)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
__all__: list[str] = ["TestPrefix"]
|
|
4
|
+
|
|
5
|
+
import unittest
|
|
6
|
+
from collections import abc
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from Lazy import Lazy
|
|
10
|
+
|
|
11
|
+
import datahold
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestPrefix(unittest.TestCase):
|
|
15
|
+
def _test_prefix(self: Self, name: str, /) -> None:
|
|
16
|
+
datatype = getattr(datahold, name)
|
|
17
|
+
self.assertEqual(datatype.__name__, name)
|
|
18
|
+
self.assertTrue(hasattr(datatype, "__Frozen__"))
|
|
19
|
+
self.assertTrue(hasattr(datatype, "__frozen__"))
|
|
20
|
+
if name.startswith("Frozen"):
|
|
21
|
+
self.assertIsNot(datatype.__hash__, object.__hash__)
|
|
22
|
+
self.assertTrue(issubclass(datatype, abc.Hashable))
|
|
23
|
+
self.assertFalse(hasattr(datatype, "__Mutable__"))
|
|
24
|
+
self.assertFalse(hasattr(datatype, "__mutate__"))
|
|
25
|
+
return
|
|
26
|
+
self.assertIn(datatype.__hash__, [None, object.__hash__])
|
|
27
|
+
if name.startswith("Mutable"):
|
|
28
|
+
self.assertTrue(hasattr(datatype, "__Mutable__"))
|
|
29
|
+
self.assertTrue(hasattr(datatype, "__mutate__"))
|
|
30
|
+
return
|
|
31
|
+
self.assertFalse(hasattr(datatype, "__Mutable__"))
|
|
32
|
+
self.assertFalse(hasattr(datatype, "__mutate__"))
|
|
33
|
+
|
|
34
|
+
def test_prefix(self: Self, /) -> None:
|
|
35
|
+
for name in Lazy.lazy.datatypes.keys():
|
|
36
|
+
with self.subTest(datatype=name):
|
|
37
|
+
self._test_prefix(name)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
if __name__ == "__main__":
|
|
41
|
+
unittest.main(verbosity=2)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[datatypes.Collection]
|
|
2
|
+
|
|
1
3
|
[datatypes.FrozenListLike]
|
|
2
4
|
abstractmethods = [
|
|
3
5
|
"__frozen__",
|
|
@@ -16,9 +18,9 @@ __init__ = "datahold.ListLike"
|
|
|
16
18
|
"collections.abc.Sequence" = true
|
|
17
19
|
|
|
18
20
|
[datatypes.FrozenListLike.nested]
|
|
19
|
-
Frozen = "builtins.tuple"
|
|
20
21
|
Init = "collections.abc.Iterable"
|
|
21
|
-
|
|
22
|
+
__Frozen__ = "builtins.tuple"
|
|
23
|
+
__Mutable__ = ""
|
|
22
24
|
|
|
23
25
|
[datatypes.FrozenListLike.varia]
|
|
24
26
|
generic = 1
|
|
@@ -131,9 +133,9 @@ args = [
|
|
|
131
133
|
]
|
|
132
134
|
|
|
133
135
|
[datatypes.FrozenListSlot.nested]
|
|
134
|
-
Frozen = "builtins.tuple"
|
|
135
136
|
Init = "collections.abc.Iterable"
|
|
136
|
-
|
|
137
|
+
__Frozen__ = "builtins.tuple"
|
|
138
|
+
__Mutable__ = ""
|
|
137
139
|
|
|
138
140
|
[datatypes.FrozenListSlot.varia]
|
|
139
141
|
generic = 1
|
|
@@ -147,7 +149,7 @@ abstractmethods = [
|
|
|
147
149
|
[datatypes.ListLike.attributes]
|
|
148
150
|
__frozen__ = "datahold.ListLike"
|
|
149
151
|
__init__ = "datahold.ListLike"
|
|
150
|
-
|
|
152
|
+
__mutate__ = ""
|
|
151
153
|
__reversed__ = "collections.abc.Sequence"
|
|
152
154
|
count = "collections.abc.Sequence"
|
|
153
155
|
index = "collections.abc.Sequence"
|
|
@@ -157,11 +159,12 @@ index = "collections.abc.Sequence"
|
|
|
157
159
|
"collections.abc.MutableSequence" = false
|
|
158
160
|
"collections.abc.Sequence" = true
|
|
159
161
|
"datahold.ListLike" = true
|
|
162
|
+
"datahold.MutableSequence" = false
|
|
160
163
|
|
|
161
164
|
[datatypes.ListLike.nested]
|
|
162
|
-
Frozen = "builtins.tuple"
|
|
163
165
|
Init = "collections.abc.Iterable"
|
|
164
|
-
|
|
166
|
+
__Frozen__ = "builtins.tuple"
|
|
167
|
+
__Mutable__ = ""
|
|
165
168
|
|
|
166
169
|
[datatypes.ListLike.varia]
|
|
167
170
|
generic = 1
|
|
@@ -172,26 +175,25 @@ abstractmethods = [
|
|
|
172
175
|
]
|
|
173
176
|
|
|
174
177
|
[datatypes.ListSlot.nested]
|
|
175
|
-
Frozen = "builtins.tuple"
|
|
176
178
|
Init = "collections.abc.Iterable"
|
|
177
|
-
|
|
179
|
+
__Frozen__ = "builtins.tuple"
|
|
180
|
+
__Mutable__ = ""
|
|
178
181
|
|
|
179
182
|
[datatypes.ListSlot.varia]
|
|
180
183
|
generic = 1
|
|
181
184
|
|
|
182
185
|
[datatypes.MutableListLike]
|
|
183
186
|
abstractmethods = [
|
|
184
|
-
"
|
|
185
|
-
"__mutable__",
|
|
187
|
+
"__mutate__",
|
|
186
188
|
]
|
|
187
189
|
|
|
188
190
|
[datatypes.MutableListLike.attributes]
|
|
189
191
|
__add__ = "datahold.MutableListLike"
|
|
190
|
-
__frozen__ = "datahold.
|
|
192
|
+
__frozen__ = "datahold.MutableListLike"
|
|
191
193
|
__iadd__ = "collections.abc.MutableSequence"
|
|
192
194
|
__imul__ = "datahold.MutableListLike"
|
|
193
195
|
__init__ = "datahold.MutableListLike"
|
|
194
|
-
|
|
196
|
+
__mutate__ = "datahold.MutableListLike"
|
|
195
197
|
__reversed__ = "collections.abc.Sequence"
|
|
196
198
|
append = "collections.abc.MutableSequence"
|
|
197
199
|
clear = "collections.abc.MutableSequence"
|
|
@@ -199,6 +201,7 @@ count = "collections.abc.Sequence"
|
|
|
199
201
|
extend = "collections.abc.MutableSequence"
|
|
200
202
|
foo = ""
|
|
201
203
|
index = "collections.abc.Sequence"
|
|
204
|
+
insert = "datahold.MutableListLike"
|
|
202
205
|
pop = "collections.abc.MutableSequence"
|
|
203
206
|
remove = "collections.abc.MutableSequence"
|
|
204
207
|
reverse = "collections.abc.MutableSequence"
|
|
@@ -208,10 +211,11 @@ reverse = "collections.abc.MutableSequence"
|
|
|
208
211
|
"collections.abc.Hashable" = false
|
|
209
212
|
"collections.abc.MutableMapping" = false
|
|
210
213
|
"collections.abc.MutableSequence" = true
|
|
214
|
+
"datahold.MutableSequence" = true
|
|
211
215
|
|
|
212
216
|
[datatypes.MutableListLike.nested]
|
|
213
|
-
Frozen = "builtins.tuple"
|
|
214
217
|
Init = "collections.abc.Iterable"
|
|
218
|
+
__Frozen__ = "builtins.tuple"
|
|
215
219
|
__hash__ = ""
|
|
216
220
|
|
|
217
221
|
[datatypes.MutableListLike.varia]
|
|
@@ -227,11 +231,27 @@ abstractmethods = []
|
|
|
227
231
|
"datahold.MutableListSlot" = true
|
|
228
232
|
|
|
229
233
|
[datatypes.MutableListSlot.nested]
|
|
230
|
-
Frozen = "builtins.tuple"
|
|
231
234
|
Init = "collections.abc.Iterable"
|
|
235
|
+
__Frozen__ = "builtins.tuple"
|
|
232
236
|
__hash__ = ""
|
|
233
237
|
|
|
234
238
|
[datatypes.MutableListSlot.varia]
|
|
235
239
|
generic = 1
|
|
236
240
|
|
|
241
|
+
[datatypes.MutableSequence.attributes]
|
|
242
|
+
__Frozen__ = "datahold.Sequence"
|
|
243
|
+
__Mutable__ = "datahold.MutableSequence"
|
|
244
|
+
__delitem__ = "datahold.MutableSequence"
|
|
245
|
+
__frozen__ = "datahold.Sequence"
|
|
246
|
+
__getitem__ = "datahold.MutableSequence"
|
|
247
|
+
__mutate__ = "datahold.MutableSequence"
|
|
248
|
+
__setitem__ = "datahold.MutableSequence"
|
|
249
|
+
insert = "datahold.MutableSequence"
|
|
250
|
+
sort = ""
|
|
251
|
+
|
|
252
|
+
[datatypes.Sequence]
|
|
253
|
+
abstractmethods = [
|
|
254
|
+
"__frozen__",
|
|
255
|
+
]
|
|
256
|
+
|
|
237
257
|
[non_datatypes]
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
"""Provide provides base classes for customized collections."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
__all__: list[str] = [
|
|
6
|
-
"FrozenListLike",
|
|
7
|
-
"FrozenListSlot",
|
|
8
|
-
"ListLike",
|
|
9
|
-
"ListSlot",
|
|
10
|
-
"MutableListLike",
|
|
11
|
-
"MutableListSlot",
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
from abc import abstractmethod
|
|
15
|
-
from collections import abc
|
|
16
|
-
from contextlib import contextmanager
|
|
17
|
-
from types import NotImplementedType, TracebackType
|
|
18
|
-
from typing import Any, Optional, Protocol, Self, SupportsIndex, overload
|
|
19
|
-
|
|
20
|
-
import setdoc
|
|
21
|
-
|
|
22
|
-
### UTILS ###
|
|
23
|
-
|
|
24
|
-
type Slice[Index] = slice[Optional[Index], Optional[Index], Optional[Index]]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
### LIST-LIKE ###
|
|
28
|
-
class ListLike[Item](abc.Sequence[Item]):
|
|
29
|
-
"""Provide a base class for customized list-likes."""
|
|
30
|
-
|
|
31
|
-
__slots__ = ()
|
|
32
|
-
|
|
33
|
-
type Frozen[FrozenItem] = tuple[FrozenItem, ...]
|
|
34
|
-
# Frozen has to be tuple to allow covariance
|
|
35
|
-
|
|
36
|
-
type Init[InitItem] = abc.Iterable[InitItem]
|
|
37
|
-
|
|
38
|
-
@setdoc.basic
|
|
39
|
-
def __add__[Item_](
|
|
40
|
-
self: Self, other: ListLike[Item_], /
|
|
41
|
-
) -> ListLike[Item | Item_]:
|
|
42
|
-
if isinstance(other, ListLike):
|
|
43
|
-
return type(self)(self.__frozen__() + other.__frozen__()) # type: ignore[operator]
|
|
44
|
-
else:
|
|
45
|
-
raise TypeError
|
|
46
|
-
|
|
47
|
-
@setdoc.basic
|
|
48
|
-
def __contains__(self: Self, other: object, /) -> bool:
|
|
49
|
-
return other in self.__frozen__()
|
|
50
|
-
|
|
51
|
-
@setdoc.basic
|
|
52
|
-
def __eq__(self: Self, other: object, /) -> NotImplementedType | bool:
|
|
53
|
-
if isinstance(other, ListLike):
|
|
54
|
-
return self.__frozen__() == other.__frozen__()
|
|
55
|
-
else:
|
|
56
|
-
return NotImplemented
|
|
57
|
-
|
|
58
|
-
@abstractmethod
|
|
59
|
-
@setdoc.basic
|
|
60
|
-
def __frozen__(self: Self, /) -> Frozen[Item]: ...
|
|
61
|
-
|
|
62
|
-
@setdoc.basic
|
|
63
|
-
def __ge__(self: Self, other: ListLike[Any], /) -> bool:
|
|
64
|
-
if isinstance(other, ListLike):
|
|
65
|
-
return self.__frozen__() >= other.__frozen__()
|
|
66
|
-
else:
|
|
67
|
-
return NotImplemented
|
|
68
|
-
|
|
69
|
-
@overload
|
|
70
|
-
@setdoc.basic
|
|
71
|
-
def __getitem__(self: Self, key: SupportsIndex, /) -> Item: ...
|
|
72
|
-
|
|
73
|
-
@overload
|
|
74
|
-
@setdoc.basic
|
|
75
|
-
def __getitem__(self: Self, key: Slice[SupportsIndex], /) -> Self: ...
|
|
76
|
-
|
|
77
|
-
@setdoc.basic
|
|
78
|
-
def __getitem__(
|
|
79
|
-
self: Self,
|
|
80
|
-
key: SupportsIndex | Slice[SupportsIndex],
|
|
81
|
-
/,
|
|
82
|
-
) -> Item | Self:
|
|
83
|
-
if isinstance(key, SupportsIndex):
|
|
84
|
-
return self.__frozen__()[key]
|
|
85
|
-
else:
|
|
86
|
-
return type(self)(self.__frozen__()[key])
|
|
87
|
-
|
|
88
|
-
@setdoc.basic
|
|
89
|
-
def __gt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
90
|
-
if isinstance(other, ListLike):
|
|
91
|
-
return self.__frozen__() > other.__frozen__()
|
|
92
|
-
else:
|
|
93
|
-
return NotImplemented
|
|
94
|
-
|
|
95
|
-
@abstractmethod
|
|
96
|
-
@setdoc.basic
|
|
97
|
-
def __init__(self: Self, data: Init[Item] = (), /) -> None: ...
|
|
98
|
-
|
|
99
|
-
@setdoc.basic
|
|
100
|
-
def __le__(self: Self, other: ListLike[Any], /) -> bool:
|
|
101
|
-
if isinstance(other, ListLike):
|
|
102
|
-
return self.__frozen__() <= other.__frozen__()
|
|
103
|
-
else:
|
|
104
|
-
return NotImplemented
|
|
105
|
-
|
|
106
|
-
@setdoc.basic
|
|
107
|
-
def __len__(self: Self, /) -> int:
|
|
108
|
-
return len(self.__frozen__())
|
|
109
|
-
|
|
110
|
-
@setdoc.basic
|
|
111
|
-
def __lt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
112
|
-
if isinstance(other, ListLike):
|
|
113
|
-
return self.__frozen__() < other.__frozen__()
|
|
114
|
-
else:
|
|
115
|
-
return NotImplemented
|
|
116
|
-
|
|
117
|
-
@setdoc.basic
|
|
118
|
-
def __mul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
119
|
-
if isinstance(other, SupportsIndex):
|
|
120
|
-
return type(self)(self.__frozen__() * other)
|
|
121
|
-
else:
|
|
122
|
-
raise TypeError
|
|
123
|
-
|
|
124
|
-
__rmul__ = __mul__
|
|
125
|
-
|
|
126
|
-
@setdoc.basic
|
|
127
|
-
def __repr__(self: Self, /) -> str:
|
|
128
|
-
return f"{type(self).__name__}({list(self)!r})"
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
class ListSlot[Item](ListLike[Item]):
|
|
132
|
-
"""Provide slotted list-like class."""
|
|
133
|
-
|
|
134
|
-
__slots__ = ("_slot",)
|
|
135
|
-
|
|
136
|
-
_slot: ListSlot.Frozen[Item]
|
|
137
|
-
|
|
138
|
-
@setdoc.basic
|
|
139
|
-
def __frozen__(self: Self) -> ListSlot.Frozen[Item]:
|
|
140
|
-
return self._slot
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
class FrozenListLike[Item](ListLike[Item], abc.Hashable):
|
|
144
|
-
"""Provide a base class for customized frozen list-likes."""
|
|
145
|
-
|
|
146
|
-
__slots__ = ()
|
|
147
|
-
|
|
148
|
-
@setdoc.basic
|
|
149
|
-
def __hash__(self: Self) -> int:
|
|
150
|
-
return hash(self.__frozen__())
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
class FrozenListSlot[Item](ListSlot[Item], FrozenListLike[Item]):
|
|
154
|
-
"""Provide a base class for customized frozen data-holds."""
|
|
155
|
-
|
|
156
|
-
__slots__ = ()
|
|
157
|
-
|
|
158
|
-
@setdoc.basic
|
|
159
|
-
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
160
|
-
self._slot = tuple(data)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
class MutableListLike[Item](ListLike[Item], abc.MutableSequence[Item]):
|
|
164
|
-
"""Provide a base class for customized mutable list-likes."""
|
|
165
|
-
|
|
166
|
-
__slots__ = ()
|
|
167
|
-
|
|
168
|
-
@setdoc.basic
|
|
169
|
-
class Mutable[MutableItem](Protocol):
|
|
170
|
-
@setdoc.basic
|
|
171
|
-
def __enter__(self: Self, /) -> list[MutableItem]: ...
|
|
172
|
-
@setdoc.basic
|
|
173
|
-
def __exit__(
|
|
174
|
-
self,
|
|
175
|
-
exc_type: type[BaseException] | None,
|
|
176
|
-
exc_value: BaseException | None,
|
|
177
|
-
traceback: TracebackType | None,
|
|
178
|
-
/,
|
|
179
|
-
) -> object: ...
|
|
180
|
-
|
|
181
|
-
@overload
|
|
182
|
-
@setdoc.basic
|
|
183
|
-
def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
|
|
184
|
-
@overload
|
|
185
|
-
@setdoc.basic
|
|
186
|
-
def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
|
|
187
|
-
@setdoc.basic
|
|
188
|
-
def __delitem__(
|
|
189
|
-
self: Self, key: SupportsIndex | Slice[SupportsIndex], /
|
|
190
|
-
) -> None:
|
|
191
|
-
with self.__mutable__() as mutable:
|
|
192
|
-
del mutable[key]
|
|
193
|
-
|
|
194
|
-
@setdoc.basic
|
|
195
|
-
def __imul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
196
|
-
with self.__mutable__() as mutable:
|
|
197
|
-
mutable *= other
|
|
198
|
-
return self
|
|
199
|
-
|
|
200
|
-
@setdoc.basic
|
|
201
|
-
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
202
|
-
with self.__mutable__() as mutable:
|
|
203
|
-
mutable.extend(data)
|
|
204
|
-
|
|
205
|
-
@abstractmethod
|
|
206
|
-
@setdoc.basic
|
|
207
|
-
def __mutable__(self: Self, /) -> Mutable[Item]: ...
|
|
208
|
-
|
|
209
|
-
@overload
|
|
210
|
-
@setdoc.basic
|
|
211
|
-
def __setitem__(
|
|
212
|
-
self: Self, key: SupportsIndex, value: Item, /
|
|
213
|
-
) -> None: ...
|
|
214
|
-
@overload
|
|
215
|
-
@setdoc.basic
|
|
216
|
-
def __setitem__(
|
|
217
|
-
self: Self, key: Slice[SupportsIndex], value: abc.Iterable[Item], /
|
|
218
|
-
) -> None: ...
|
|
219
|
-
@setdoc.basic
|
|
220
|
-
def __setitem__(
|
|
221
|
-
self: Self,
|
|
222
|
-
key: SupportsIndex | Slice[SupportsIndex],
|
|
223
|
-
value: Item | abc.Iterable[Item],
|
|
224
|
-
/,
|
|
225
|
-
) -> None:
|
|
226
|
-
with self.__mutable__() as mutable:
|
|
227
|
-
mutable[key] = value # type: ignore
|
|
228
|
-
|
|
229
|
-
@setdoc.basic
|
|
230
|
-
def copy(self: Self) -> Self:
|
|
231
|
-
return type(self)(self.__frozen__())
|
|
232
|
-
|
|
233
|
-
@setdoc.basic
|
|
234
|
-
def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
|
|
235
|
-
with self.__mutable__() as mutable:
|
|
236
|
-
mutable.insert(index, item)
|
|
237
|
-
|
|
238
|
-
@setdoc.basic
|
|
239
|
-
def sort(self: Self, /, *, key: Any = None, reverse: bool = False) -> None:
|
|
240
|
-
# list.sort reveals Overload(
|
|
241
|
-
# def [_T, SupportsRichComparisonT <: _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any]] (self: list[SupportsRichComparisonT], *, key: None =, reverse: bool =),
|
|
242
|
-
# def [_T] (self: list[_T], *, key: def (_T) -> _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any], reverse: bool =),
|
|
243
|
-
# )
|
|
244
|
-
with self.__mutable__() as mutable:
|
|
245
|
-
mutable.sort(key=key, reverse=reverse)
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
class MutableListSlot[Item](ListSlot[Item], MutableListLike[Item]):
|
|
249
|
-
"""Provide slotted mutable list-like class."""
|
|
250
|
-
|
|
251
|
-
__slots__ = ()
|
|
252
|
-
|
|
253
|
-
@contextmanager
|
|
254
|
-
@setdoc.basic
|
|
255
|
-
def __mutable__(self: Self, /) -> abc.Generator[list[Item], None, None]:
|
|
256
|
-
slot = list(getattr(self, "_slot", ()))
|
|
257
|
-
yield slot
|
|
258
|
-
self._slot = tuple(slot)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|