datahold 3.0.33__tar.gz → 3.0.34.dev0__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-3.0.33 → datahold-3.0.34.dev0}/PKG-INFO +1 -1
- {datahold-3.0.33 → datahold-3.0.34.dev0}/pyproject.toml +1 -1
- datahold-3.0.34.dev0/src/datahold/base/BaseDataCollection.py +32 -0
- datahold-3.0.34.dev0/src/datahold/base/BaseDataDict.py +102 -0
- datahold-3.0.34.dev0/src/datahold/base/BaseDataList.py +78 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseDataObject.py +22 -13
- datahold-3.0.34.dev0/src/datahold/base/BaseDataSet.py +96 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldDict.py +3 -3
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldList.py +2 -2
- datahold-3.0.34.dev0/src/datahold/core/DataDict.py +146 -0
- datahold-3.0.34.dev0/src/datahold/core/DataList.py +117 -0
- datahold-3.0.34.dev0/src/datahold/core/DataSet.py +126 -0
- datahold-3.0.34.dev0/src/datahold/core/HoldDict.py +35 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataDict.py +2 -1
- datahold-3.0.34.dev0/src/datahold/frozen/FrozenHoldDict.py +34 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestCopy.py +5 -5
- datahold-3.0.34.dev0/src/datahold/typing/HashableCollection.py +9 -0
- datahold-3.0.34.dev0/src/datahold/typing/SupportsKeysAndGetitem.py +11 -0
- datahold-3.0.34.dev0/src/datahold/typing/__init__.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/PKG-INFO +1 -1
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/SOURCES.txt +5 -1
- datahold-3.0.33/src/datahold/base/BaseDataDict.py +0 -102
- datahold-3.0.33/src/datahold/base/BaseDataList.py +0 -78
- datahold-3.0.33/src/datahold/base/BaseDataSet.py +0 -202
- datahold-3.0.33/src/datahold/core/DataDict.py +0 -113
- datahold-3.0.33/src/datahold/core/DataList.py +0 -112
- datahold-3.0.33/src/datahold/core/DataSet.py +0 -131
- datahold-3.0.33/src/datahold/core/HoldDict.py +0 -30
- datahold-3.0.33/src/datahold/frozen/FrozenHoldDict.py +0 -24
- {datahold-3.0.33 → datahold-3.0.34.dev0}/LICENSE.txt +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/MANIFEST.in +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/README.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v1.1.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v1.2.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.0.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.1.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.2.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.3.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v3.0.rst +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/setup.cfg +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/__init__.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldObject.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldSet.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/DataObject.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldList.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldObject.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldSet.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/__init__.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataList.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataObject.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataSet.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldList.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldObject.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldSet.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/py.typed +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/__init__.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_0.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestAbstractness.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestDataAttribute.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestFrozenMutability.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestInheritance.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestMutableBehavior.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestProtocols.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_generic.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_object.py +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/requires.txt +0 -0
- {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from collections.abc import Collection, Iterator
|
|
3
|
+
from typing import Self, TypeVar
|
|
4
|
+
|
|
5
|
+
import setdoc
|
|
6
|
+
|
|
7
|
+
from ..typing.HashableCollection import HashableCollection
|
|
8
|
+
from .BaseDataObject import BaseDataObject
|
|
9
|
+
|
|
10
|
+
__all__ = ["BaseDataCollection"]
|
|
11
|
+
|
|
12
|
+
Item = TypeVar("Item", covariant=True)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BaseDataCollection(BaseDataObject, Collection[Item]):
|
|
16
|
+
__slots__ = ()
|
|
17
|
+
|
|
18
|
+
@setdoc.basic
|
|
19
|
+
def __contains__(self: Self, other: object, /) -> bool:
|
|
20
|
+
return other in self.data
|
|
21
|
+
|
|
22
|
+
@setdoc.basic
|
|
23
|
+
def __iter__(self: Self, /) -> Iterator[Item]:
|
|
24
|
+
return iter(self.data)
|
|
25
|
+
|
|
26
|
+
@setdoc.basic
|
|
27
|
+
def __len__(self: Self, /) -> int:
|
|
28
|
+
return len(self.data)
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def data(self: Self) -> HashableCollection[Item]: ...
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from collections.abc import (
|
|
5
|
+
Hashable,
|
|
6
|
+
ItemsView,
|
|
7
|
+
Iterable,
|
|
8
|
+
Iterator,
|
|
9
|
+
KeysView,
|
|
10
|
+
Mapping,
|
|
11
|
+
ValuesView,
|
|
12
|
+
)
|
|
13
|
+
from typing import Optional, Self, TypeVar
|
|
14
|
+
|
|
15
|
+
import setdoc
|
|
16
|
+
from frozendict import frozendict
|
|
17
|
+
|
|
18
|
+
from ..typing.SupportsKeysAndGetitem import SupportsKeysAndGetitem
|
|
19
|
+
from .BaseDataCollection import BaseDataCollection
|
|
20
|
+
|
|
21
|
+
__all__ = ["BaseDataDict"]
|
|
22
|
+
|
|
23
|
+
Key = TypeVar("Key", bound=Hashable, covariant=True)
|
|
24
|
+
Value = TypeVar("Value", covariant=True)
|
|
25
|
+
Value_ = TypeVar("Value_")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BaseDataDict(
|
|
29
|
+
BaseDataCollection[Key | str], Mapping[Key | str, Optional[Value]]
|
|
30
|
+
):
|
|
31
|
+
|
|
32
|
+
__slots__ = ()
|
|
33
|
+
|
|
34
|
+
@setdoc.setdoc(dict.__getitem__.__doc__)
|
|
35
|
+
def __getitem__(self: Self, key: Hashable, /) -> Optional[Value]:
|
|
36
|
+
return self.data[key] # type: ignore[index]
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
@setdoc.setdoc(dict.__init__.__doc__)
|
|
40
|
+
def __init__(
|
|
41
|
+
self: Self,
|
|
42
|
+
data: (
|
|
43
|
+
SupportsKeysAndGetitem[Key | str, Optional[Value]]
|
|
44
|
+
| Iterable[tuple[Key | str, Optional[Value]]]
|
|
45
|
+
) = (),
|
|
46
|
+
/,
|
|
47
|
+
**kwargs: Optional[Value],
|
|
48
|
+
) -> None: ...
|
|
49
|
+
|
|
50
|
+
@setdoc.basic
|
|
51
|
+
def __or__(
|
|
52
|
+
self: Self,
|
|
53
|
+
other: BaseDataDict[Key, Value],
|
|
54
|
+
/,
|
|
55
|
+
) -> Self:
|
|
56
|
+
return type(self)(self.data | other.data)
|
|
57
|
+
|
|
58
|
+
@setdoc.setdoc(dict.__repr__.__doc__)
|
|
59
|
+
def __repr__(self: Self, /) -> str:
|
|
60
|
+
return f"{type(self).__name__}({dict(self)})"
|
|
61
|
+
|
|
62
|
+
@setdoc.setdoc(dict.__reversed__.__doc__)
|
|
63
|
+
def __reversed__(self: Self, /) -> Iterator[Key | str]:
|
|
64
|
+
return reversed(self.data)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def data(self: Self) -> frozendict[Key | str, Optional[Value]]: ...
|
|
69
|
+
|
|
70
|
+
@classmethod
|
|
71
|
+
@setdoc.setdoc(dict.fromkeys.__doc__)
|
|
72
|
+
def fromkeys(
|
|
73
|
+
cls: type[Self],
|
|
74
|
+
iterable: Iterable[Key | str],
|
|
75
|
+
value: Optional[Value] = None,
|
|
76
|
+
/,
|
|
77
|
+
) -> Self:
|
|
78
|
+
return cls(dict.fromkeys(iterable, value))
|
|
79
|
+
|
|
80
|
+
@setdoc.setdoc(dict.get.__doc__)
|
|
81
|
+
def get(
|
|
82
|
+
self: Self,
|
|
83
|
+
key: Hashable,
|
|
84
|
+
default: Optional[Value_] = None,
|
|
85
|
+
/,
|
|
86
|
+
) -> Optional[Value | Value_]:
|
|
87
|
+
return self.data.get(key, default) # type: ignore[arg-type]
|
|
88
|
+
|
|
89
|
+
@setdoc.basic
|
|
90
|
+
def items(
|
|
91
|
+
self: Self,
|
|
92
|
+
/,
|
|
93
|
+
) -> ItemsView[Key | str, Optional[Value]]:
|
|
94
|
+
return dict(self.data).items()
|
|
95
|
+
|
|
96
|
+
@setdoc.basic
|
|
97
|
+
def keys(self: Self, /) -> KeysView[Key | str]:
|
|
98
|
+
return dict(self.data).keys()
|
|
99
|
+
|
|
100
|
+
@setdoc.basic
|
|
101
|
+
def values(self: Self, /) -> ValuesView[Optional[Value]]:
|
|
102
|
+
return dict(self.data).values()
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
from collections.abc import Hashable, Iterable, Iterator, Sequence
|
|
6
|
+
from typing import Any, Self, SupportsIndex, TypeVar, cast, overload
|
|
7
|
+
|
|
8
|
+
import setdoc
|
|
9
|
+
|
|
10
|
+
from .BaseDataCollection import BaseDataCollection
|
|
11
|
+
|
|
12
|
+
__all__ = ["BaseDataList"]
|
|
13
|
+
|
|
14
|
+
Item = TypeVar("Item", covariant=True)
|
|
15
|
+
Item_ = TypeVar("Item_")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BaseDataList(BaseDataCollection[Item], Sequence[Item]):
|
|
19
|
+
__slots__ = ()
|
|
20
|
+
|
|
21
|
+
@setdoc.basic
|
|
22
|
+
def __add__(self: Self, other: Iterable[Item], /) -> Self:
|
|
23
|
+
return type(self)(self.data + tuple(other))
|
|
24
|
+
|
|
25
|
+
@overload
|
|
26
|
+
@setdoc.basic
|
|
27
|
+
def __getitem__(self: Self, index: SupportsIndex, /) -> Item: ...
|
|
28
|
+
|
|
29
|
+
@overload
|
|
30
|
+
@setdoc.basic
|
|
31
|
+
def __getitem__(self: Self, index: slice, /) -> Self: ...
|
|
32
|
+
|
|
33
|
+
@setdoc.basic
|
|
34
|
+
def __getitem__(
|
|
35
|
+
self: Self, index: SupportsIndex | slice, /
|
|
36
|
+
) -> Item | Self:
|
|
37
|
+
if isinstance(index, SupportsIndex):
|
|
38
|
+
return self.data[index]
|
|
39
|
+
else:
|
|
40
|
+
return type(self)(self.data[index])
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
@setdoc.basic
|
|
44
|
+
def __init__(self: Self, data: Iterable[Item] = (), /) -> None: ...
|
|
45
|
+
|
|
46
|
+
@setdoc.basic
|
|
47
|
+
def __mul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
48
|
+
return type(self)(self.data * other)
|
|
49
|
+
|
|
50
|
+
@setdoc.basic
|
|
51
|
+
def __repr__(self: Self, /) -> str:
|
|
52
|
+
return f"{type(self).__name__}({list(self.data)})"
|
|
53
|
+
|
|
54
|
+
@setdoc.basic
|
|
55
|
+
def __reversed__(self: Self, /) -> Iterator[Item]:
|
|
56
|
+
return reversed(self.data)
|
|
57
|
+
|
|
58
|
+
@setdoc.basic
|
|
59
|
+
def __rmul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
60
|
+
return type(self)(other * self.data)
|
|
61
|
+
|
|
62
|
+
@setdoc.setdoc(list.count.__doc__)
|
|
63
|
+
def count(self: Self, value: Hashable, /) -> int:
|
|
64
|
+
return self.data.count(cast(Any, value))
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def data(self: Self) -> tuple[Item, ...]: ...
|
|
69
|
+
|
|
70
|
+
@setdoc.setdoc(list.index.__doc__)
|
|
71
|
+
def index(
|
|
72
|
+
self: Self,
|
|
73
|
+
value: Hashable,
|
|
74
|
+
start: SupportsIndex = 0,
|
|
75
|
+
end: SupportsIndex = sys.maxsize,
|
|
76
|
+
/,
|
|
77
|
+
) -> int:
|
|
78
|
+
return self.data.index(cast(Any, value), start, end)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
|
+
from collections.abc import Hashable
|
|
2
3
|
from typing import Any, Self
|
|
3
4
|
|
|
4
5
|
import setdoc
|
|
@@ -19,16 +20,20 @@ class BaseDataObject(metaclass=ABCMeta):
|
|
|
19
20
|
|
|
20
21
|
@setdoc.basic
|
|
21
22
|
def __ge__(self: Self, other: Any, /) -> Any:
|
|
22
|
-
if isinstance(other, BaseDataObject):
|
|
23
|
-
return
|
|
24
|
-
|
|
23
|
+
if not isinstance(other, BaseDataObject):
|
|
24
|
+
return NotImplemented
|
|
25
|
+
try:
|
|
26
|
+
return self.data.__ge__(other.data) # type: ignore[operator]
|
|
27
|
+
except Exception:
|
|
25
28
|
return NotImplemented
|
|
26
29
|
|
|
27
30
|
@setdoc.basic
|
|
28
31
|
def __gt__(self: Self, other: Any, /) -> Any:
|
|
29
|
-
if isinstance(other, BaseDataObject):
|
|
30
|
-
return
|
|
31
|
-
|
|
32
|
+
if not isinstance(other, BaseDataObject):
|
|
33
|
+
return NotImplemented
|
|
34
|
+
try:
|
|
35
|
+
return self.data.__gt__(other.data) # type: ignore[operator]
|
|
36
|
+
except Exception:
|
|
32
37
|
return NotImplemented
|
|
33
38
|
|
|
34
39
|
@abstractmethod
|
|
@@ -37,16 +42,20 @@ class BaseDataObject(metaclass=ABCMeta):
|
|
|
37
42
|
|
|
38
43
|
@setdoc.basic
|
|
39
44
|
def __le__(self: Self, other: Any, /) -> Any:
|
|
40
|
-
if isinstance(other, BaseDataObject):
|
|
41
|
-
return
|
|
42
|
-
|
|
45
|
+
if not isinstance(other, BaseDataObject):
|
|
46
|
+
return NotImplemented
|
|
47
|
+
try:
|
|
48
|
+
return self.data.__le__(other.data) # type: ignore[operator]
|
|
49
|
+
except Exception:
|
|
43
50
|
return NotImplemented
|
|
44
51
|
|
|
45
52
|
@setdoc.basic
|
|
46
53
|
def __lt__(self: Self, other: Any, /) -> Any:
|
|
47
|
-
if isinstance(other, BaseDataObject):
|
|
48
|
-
return
|
|
49
|
-
|
|
54
|
+
if not isinstance(other, BaseDataObject):
|
|
55
|
+
return NotImplemented
|
|
56
|
+
try:
|
|
57
|
+
return self.data.__lt__(other.data) # type: ignore[operator]
|
|
58
|
+
except Exception:
|
|
50
59
|
return NotImplemented
|
|
51
60
|
|
|
52
61
|
@setdoc.basic
|
|
@@ -58,4 +67,4 @@ class BaseDataObject(metaclass=ABCMeta):
|
|
|
58
67
|
|
|
59
68
|
@property
|
|
60
69
|
@abstractmethod
|
|
61
|
-
def data(self: Self) ->
|
|
70
|
+
def data(self: Self) -> Hashable: ...
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from collections.abc import Hashable, Iterable, Set
|
|
5
|
+
from typing import Generic, Self, TypeVar
|
|
6
|
+
|
|
7
|
+
import setdoc
|
|
8
|
+
|
|
9
|
+
from .BaseDataCollection import BaseDataCollection
|
|
10
|
+
|
|
11
|
+
__all__ = ["BaseDataSet"]
|
|
12
|
+
|
|
13
|
+
Item = TypeVar("Item", bound=Hashable, covariant=True)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseDataSet(BaseDataCollection[Item], Generic[Item]):
|
|
17
|
+
__slots__ = ()
|
|
18
|
+
|
|
19
|
+
@setdoc.basic
|
|
20
|
+
def __and__(
|
|
21
|
+
self: Self,
|
|
22
|
+
other: BaseDataSet[Hashable],
|
|
23
|
+
/,
|
|
24
|
+
) -> Self:
|
|
25
|
+
return type(self)(self.data & other.data)
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
@setdoc.basic
|
|
29
|
+
def __init__(self: Self, data: Iterable[Item] = (), /) -> None: ...
|
|
30
|
+
|
|
31
|
+
@setdoc.basic
|
|
32
|
+
def __or__(
|
|
33
|
+
self: Self,
|
|
34
|
+
other: BaseDataSet[Item],
|
|
35
|
+
/,
|
|
36
|
+
) -> Self:
|
|
37
|
+
return type(self)(self.data | other.data)
|
|
38
|
+
|
|
39
|
+
@setdoc.setdoc(set.__repr__.__doc__)
|
|
40
|
+
def __repr__(self: Self, /) -> str:
|
|
41
|
+
return f"{type(self).__name__}({set(self.data)})"
|
|
42
|
+
|
|
43
|
+
@setdoc.basic
|
|
44
|
+
def __sub__(
|
|
45
|
+
self: Self,
|
|
46
|
+
other: BaseDataSet[Hashable],
|
|
47
|
+
/,
|
|
48
|
+
) -> Self:
|
|
49
|
+
return type(self)(self.data - other.data)
|
|
50
|
+
|
|
51
|
+
@setdoc.basic
|
|
52
|
+
def __xor__(
|
|
53
|
+
self: Self,
|
|
54
|
+
other: BaseDataSet[Item],
|
|
55
|
+
/,
|
|
56
|
+
) -> Self:
|
|
57
|
+
return type(self)(self.data ^ other.data)
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def data(self: Self) -> frozenset[Item]: ...
|
|
62
|
+
|
|
63
|
+
@setdoc.setdoc(set.difference.__doc__)
|
|
64
|
+
def difference(self: Self, /, *others: Iterable[Hashable]) -> Self:
|
|
65
|
+
return type(self)(self.data.difference(*others))
|
|
66
|
+
|
|
67
|
+
@setdoc.setdoc(set.intersection.__doc__)
|
|
68
|
+
def intersection(self: Self, /, *others: Iterable[Hashable]) -> Self:
|
|
69
|
+
return type(self)(self.data.intersection(*others))
|
|
70
|
+
|
|
71
|
+
@setdoc.setdoc(set.isdisjoint.__doc__)
|
|
72
|
+
def isdisjoint(self: Self, other: Iterable[Hashable], /) -> bool:
|
|
73
|
+
return self.data.isdisjoint(other)
|
|
74
|
+
|
|
75
|
+
@setdoc.setdoc(set.issubset.__doc__)
|
|
76
|
+
def issubset(self: Self, other: Iterable[Hashable], /) -> bool:
|
|
77
|
+
return self.data.issubset(other)
|
|
78
|
+
|
|
79
|
+
@setdoc.setdoc(set.issuperset.__doc__)
|
|
80
|
+
def issuperset(self: Self, other: Iterable[Hashable], /) -> bool:
|
|
81
|
+
return self.data.issuperset(other)
|
|
82
|
+
|
|
83
|
+
@setdoc.setdoc(set.symmetric_difference.__doc__)
|
|
84
|
+
def symmetric_difference(
|
|
85
|
+
self: Self,
|
|
86
|
+
other: Iterable[Item],
|
|
87
|
+
/,
|
|
88
|
+
) -> Self:
|
|
89
|
+
return type(self)(self.data.symmetric_difference(other))
|
|
90
|
+
|
|
91
|
+
@setdoc.setdoc(set.union.__doc__)
|
|
92
|
+
def union(self: Self, /, *others: Iterable[Item]) -> Self:
|
|
93
|
+
return type(self)(self.data.union(*others))
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
Set.register(BaseDataSet) # type: ignore[type-abstract]
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
from typing import TypeVar
|
|
2
2
|
|
|
3
3
|
from .BaseDataDict import BaseDataDict
|
|
4
4
|
from .BaseHoldObject import BaseHoldObject
|
|
5
5
|
|
|
6
6
|
__all__ = ["BaseHoldDict"]
|
|
7
7
|
|
|
8
|
-
Key =
|
|
9
|
-
Value =
|
|
8
|
+
Key = TypeVar("Key", covariant=True)
|
|
9
|
+
Value = TypeVar("Value", covariant=True)
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class BaseHoldDict(BaseHoldObject, BaseDataDict[Key, Value]):
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
from typing import TypeVar
|
|
2
2
|
|
|
3
3
|
from .BaseDataList import BaseDataList
|
|
4
4
|
from .BaseHoldObject import BaseHoldObject
|
|
5
5
|
|
|
6
6
|
__all__ = ["BaseHoldList"]
|
|
7
7
|
|
|
8
|
-
Item =
|
|
8
|
+
Item = TypeVar("Item", covariant=True)
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class BaseHoldList(BaseHoldObject, BaseDataList[Item]):
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from collections.abc import Hashable, Iterable, MutableMapping
|
|
3
|
+
from typing import Any, Final, Optional, Self, TypeVar, overload
|
|
4
|
+
|
|
5
|
+
import setdoc
|
|
6
|
+
from frozendict import frozendict
|
|
7
|
+
|
|
8
|
+
from ..base.BaseDataDict import BaseDataDict
|
|
9
|
+
from ..typing.SupportsKeysAndGetitem import SupportsKeysAndGetitem
|
|
10
|
+
from .DataObject import DataObject
|
|
11
|
+
|
|
12
|
+
__all__ = ["DataDict"]
|
|
13
|
+
|
|
14
|
+
Key = TypeVar("Key", bound=Hashable)
|
|
15
|
+
Value = TypeVar("Value")
|
|
16
|
+
Value_ = TypeVar("Value_")
|
|
17
|
+
|
|
18
|
+
MISSING: Final[object] = object()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DataDict(
|
|
22
|
+
DataObject,
|
|
23
|
+
BaseDataDict[Key, Value],
|
|
24
|
+
MutableMapping[Key | str, Optional[Value]],
|
|
25
|
+
):
|
|
26
|
+
__slots__ = ()
|
|
27
|
+
|
|
28
|
+
@setdoc.basic
|
|
29
|
+
def __delitem__(self: Self, key: Hashable, /) -> None:
|
|
30
|
+
self.data = self.data.delete(key) # type: ignore[arg-type]
|
|
31
|
+
|
|
32
|
+
@setdoc.basic
|
|
33
|
+
def __init__(
|
|
34
|
+
self: Self,
|
|
35
|
+
data: (
|
|
36
|
+
SupportsKeysAndGetitem[Key | str, Optional[Value]]
|
|
37
|
+
| Iterable[tuple[Key | str, Optional[Value]]]
|
|
38
|
+
) = (),
|
|
39
|
+
/,
|
|
40
|
+
**kwargs: Optional[Value],
|
|
41
|
+
) -> None:
|
|
42
|
+
self.data = frozendict(data, **kwargs) # type: ignore[arg-type]
|
|
43
|
+
|
|
44
|
+
@setdoc.basic
|
|
45
|
+
def __ior__(
|
|
46
|
+
self: Self,
|
|
47
|
+
other: BaseDataDict[Key, Value],
|
|
48
|
+
/,
|
|
49
|
+
) -> Self:
|
|
50
|
+
self.data |= other.data
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
@setdoc.setdoc(dict.__setitem__.__doc__)
|
|
54
|
+
def __setitem__(
|
|
55
|
+
self: Self,
|
|
56
|
+
key: Key | str,
|
|
57
|
+
value: Optional[Value],
|
|
58
|
+
/,
|
|
59
|
+
) -> None:
|
|
60
|
+
self.data = self.data.set(key, value)
|
|
61
|
+
|
|
62
|
+
@setdoc.setdoc(dict.clear.__doc__)
|
|
63
|
+
def clear(self: Self, /) -> None:
|
|
64
|
+
self.data = frozendict()
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def data(self: Self) -> frozendict[Key | str, Optional[Value]]: ...
|
|
69
|
+
|
|
70
|
+
@data.setter
|
|
71
|
+
@abstractmethod
|
|
72
|
+
def data(
|
|
73
|
+
self: Self,
|
|
74
|
+
value: (
|
|
75
|
+
SupportsKeysAndGetitem[Key | str, Optional[Value]]
|
|
76
|
+
| Iterable[tuple[Key | str, Optional[Value]]]
|
|
77
|
+
),
|
|
78
|
+
) -> None: ...
|
|
79
|
+
|
|
80
|
+
@overload
|
|
81
|
+
@setdoc.setdoc(dict.pop.__doc__)
|
|
82
|
+
def pop(self: Self, key: Hashable, /) -> Optional[Value]: ...
|
|
83
|
+
|
|
84
|
+
@overload
|
|
85
|
+
@setdoc.setdoc(dict.pop.__doc__)
|
|
86
|
+
def pop(
|
|
87
|
+
self: Self,
|
|
88
|
+
key: Hashable,
|
|
89
|
+
default: Value_,
|
|
90
|
+
/,
|
|
91
|
+
) -> Optional[Value | Value_]: ...
|
|
92
|
+
|
|
93
|
+
@setdoc.setdoc(dict.pop.__doc__)
|
|
94
|
+
def pop(
|
|
95
|
+
self: Self,
|
|
96
|
+
key: Hashable,
|
|
97
|
+
default: Any = MISSING,
|
|
98
|
+
/,
|
|
99
|
+
) -> Optional[Value | Value_]:
|
|
100
|
+
ans: Optional[Value | Value_]
|
|
101
|
+
data: dict[Key | str, Optional[Value]]
|
|
102
|
+
data = dict(self.data)
|
|
103
|
+
if default is MISSING:
|
|
104
|
+
ans = data.pop(key) # type: ignore[arg-type]
|
|
105
|
+
else:
|
|
106
|
+
ans = data.pop(key, default) # type: ignore[arg-type]
|
|
107
|
+
self.data = frozendict(data)
|
|
108
|
+
return ans
|
|
109
|
+
|
|
110
|
+
@setdoc.setdoc(dict.popitem.__doc__)
|
|
111
|
+
def popitem(self: Self, /) -> tuple[Key | str, Optional[Value]]:
|
|
112
|
+
ans: tuple[Key | str, Optional[Value]]
|
|
113
|
+
data: dict[Key | str, Optional[Value]]
|
|
114
|
+
data = dict(self.data)
|
|
115
|
+
ans = data.popitem()
|
|
116
|
+
self.data = frozendict(data)
|
|
117
|
+
return ans
|
|
118
|
+
|
|
119
|
+
@setdoc.setdoc(dict.setdefault.__doc__)
|
|
120
|
+
def setdefault(
|
|
121
|
+
self: Self,
|
|
122
|
+
key: Key | str,
|
|
123
|
+
default: Optional[Value] = None,
|
|
124
|
+
/,
|
|
125
|
+
) -> Optional[Value]:
|
|
126
|
+
ans: Optional[Value]
|
|
127
|
+
data: dict[Key | str, Optional[Value]]
|
|
128
|
+
data = dict(self.data)
|
|
129
|
+
ans = data.setdefault(key, default)
|
|
130
|
+
self.data = frozendict(data)
|
|
131
|
+
return ans
|
|
132
|
+
|
|
133
|
+
@setdoc.setdoc(dict.update.__doc__)
|
|
134
|
+
def update(
|
|
135
|
+
self: Self,
|
|
136
|
+
other: (
|
|
137
|
+
SupportsKeysAndGetitem[Key | str, Optional[Value]]
|
|
138
|
+
| Iterable[tuple[Key | str, Optional[Value]]]
|
|
139
|
+
) = (),
|
|
140
|
+
/,
|
|
141
|
+
**kwargs: Optional[Value],
|
|
142
|
+
) -> None:
|
|
143
|
+
data: dict[Key | str, Optional[Value]]
|
|
144
|
+
data = dict(self.data)
|
|
145
|
+
data.update(other, **kwargs)
|
|
146
|
+
self.data = frozendict(data)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from collections.abc import Iterable, MutableSequence
|
|
2
|
+
from typing import Any, Optional, Self, SupportsIndex, TypeVar, overload
|
|
3
|
+
|
|
4
|
+
import setdoc
|
|
5
|
+
|
|
6
|
+
from ..base.BaseDataList import BaseDataList
|
|
7
|
+
from .DataObject import DataObject
|
|
8
|
+
|
|
9
|
+
__all__ = ["DataList"]
|
|
10
|
+
|
|
11
|
+
Item = TypeVar("Item")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DataList(
|
|
15
|
+
DataObject,
|
|
16
|
+
BaseDataList[Item],
|
|
17
|
+
MutableSequence[Item],
|
|
18
|
+
):
|
|
19
|
+
__slots__ = ()
|
|
20
|
+
|
|
21
|
+
@setdoc.basic
|
|
22
|
+
def __delitem__(self: Self, other: SupportsIndex | slice, /) -> None:
|
|
23
|
+
data: list[Item]
|
|
24
|
+
data = list(self.data)
|
|
25
|
+
del data[other]
|
|
26
|
+
self.data = tuple(data)
|
|
27
|
+
|
|
28
|
+
@setdoc.basic
|
|
29
|
+
def __iadd__(self: Self, other: Iterable[Item], /) -> Self:
|
|
30
|
+
self.data += tuple(other)
|
|
31
|
+
return self
|
|
32
|
+
|
|
33
|
+
@setdoc.basic
|
|
34
|
+
def __imul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
35
|
+
self.data *= other
|
|
36
|
+
return self
|
|
37
|
+
|
|
38
|
+
@setdoc.basic
|
|
39
|
+
def __init__(
|
|
40
|
+
self: Self,
|
|
41
|
+
data: Iterable[Item] = (),
|
|
42
|
+
/,
|
|
43
|
+
) -> None:
|
|
44
|
+
self.data = tuple(data)
|
|
45
|
+
|
|
46
|
+
@overload
|
|
47
|
+
@setdoc.basic
|
|
48
|
+
def __setitem__(
|
|
49
|
+
self: Self, key: SupportsIndex, value: Item, /
|
|
50
|
+
) -> None: ...
|
|
51
|
+
|
|
52
|
+
@overload
|
|
53
|
+
@setdoc.basic
|
|
54
|
+
def __setitem__(
|
|
55
|
+
self: Self,
|
|
56
|
+
key: slice,
|
|
57
|
+
value: Iterable[Item],
|
|
58
|
+
/,
|
|
59
|
+
) -> None: ...
|
|
60
|
+
|
|
61
|
+
@setdoc.basic
|
|
62
|
+
def __setitem__(
|
|
63
|
+
self: Self,
|
|
64
|
+
key: SupportsIndex | slice,
|
|
65
|
+
value: Item | Iterable[Item],
|
|
66
|
+
/,
|
|
67
|
+
) -> None:
|
|
68
|
+
data: Any
|
|
69
|
+
data = list(self.data)
|
|
70
|
+
data[key] = value
|
|
71
|
+
self.data = tuple(data)
|
|
72
|
+
|
|
73
|
+
@setdoc.setdoc(list.append.__doc__)
|
|
74
|
+
def append(self: Self, value: Item, /) -> None:
|
|
75
|
+
self.data += (value,)
|
|
76
|
+
|
|
77
|
+
@setdoc.setdoc(list.clear.__doc__)
|
|
78
|
+
def clear(self: Self, /) -> None:
|
|
79
|
+
self.data = ()
|
|
80
|
+
|
|
81
|
+
@setdoc.setdoc(list.extend.__doc__)
|
|
82
|
+
def extend(self: Self, iterable: Iterable[Item], /) -> None:
|
|
83
|
+
self.data += tuple(iterable)
|
|
84
|
+
|
|
85
|
+
@setdoc.setdoc(list.insert.__doc__)
|
|
86
|
+
def insert(self: Self, index: SupportsIndex, object: Item, /) -> None:
|
|
87
|
+
data: list[Item]
|
|
88
|
+
data = list(self.data)
|
|
89
|
+
data.insert(index, object)
|
|
90
|
+
self.data = tuple(data)
|
|
91
|
+
|
|
92
|
+
@setdoc.setdoc(list.pop.__doc__)
|
|
93
|
+
def pop(self: Self, index: SupportsIndex = -1, /) -> Item:
|
|
94
|
+
ans: Item
|
|
95
|
+
data: list[Item]
|
|
96
|
+
data = list(self.data)
|
|
97
|
+
ans = data.pop(index)
|
|
98
|
+
self.data = tuple(data)
|
|
99
|
+
return ans
|
|
100
|
+
|
|
101
|
+
@setdoc.setdoc(list.remove.__doc__)
|
|
102
|
+
def remove(self: Self, value: object) -> None:
|
|
103
|
+
data: list[Item]
|
|
104
|
+
data = list(self.data)
|
|
105
|
+
data.remove(value) # type: ignore[arg-type]
|
|
106
|
+
self.data = tuple(data)
|
|
107
|
+
|
|
108
|
+
@setdoc.setdoc(list.reverse.__doc__)
|
|
109
|
+
def reverse(self: Self) -> None:
|
|
110
|
+
self.data = tuple(self.data[::-1])
|
|
111
|
+
|
|
112
|
+
@setdoc.setdoc(list.sort.__doc__)
|
|
113
|
+
def sort(self: Self, key: Any = None, reverse: bool = False) -> None:
|
|
114
|
+
data: list[Item]
|
|
115
|
+
data = list(self.data)
|
|
116
|
+
data.sort(key=key, reverse=reverse)
|
|
117
|
+
self.data = tuple(data)
|