-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinspiredByPandas.py
216 lines (166 loc) · 7.14 KB
/
inspiredByPandas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
from copy import copy
import random
from time import time_ns
import itertools
counter = itertools.count()
class Element:
__id: int
ordering_value: int
string_content: str
def __init__(self, ordering_value: int, string_content: str) -> None:
self.__id = next(counter)
self.ordering_value = ordering_value
self.string_content = string_content
def get_id(self):
return self.__id
def __str__(self) -> str:
return f"{self.string_content} -> {self.ordering_value}"
def __repr__(self) -> str:
return f"<SmartElement({self.ordering_value}, {self.string_content}) and __id = {self.__id}>"
class SmartElement(Element):
def __eq__(self, __o: Element | int) -> bool:
if type(__o) == int:
return self.ordering_value == __o
return self.ordering_value == __o.ordering_value
def __ne__(self, __o: Element | int) -> bool:
return not self.__eq__(__o)
def __gt__(self, __o: Element | int) -> bool:
if type(__o) == int:
return self.ordering_value > __o
return self.ordering_value > __o.ordering_value
def __lt__(self, __o: Element | int) -> bool:
if type(__o) == int:
return self.ordering_value < __o
return self.ordering_value < __o.ordering_value
def __ge__(self, __o: Element | int) -> bool:
if type(__o) == int:
return self.ordering_value >= __o
return self.ordering_value >= __o.ordering_value
def __le__(self, __o: Element | int) -> bool:
if type(__o) == int:
return self.ordering_value <= __o
return self.ordering_value <= __o.ordering_value
def __mod__(self, __o: Element | int) -> int:
if type(__o) == int:
return self.ordering_value % __o
return self.ordering_value % __o.ordering_value
class IdSeries(tuple):
def __contains__(self, key) -> bool:
key_type = type(key)
if key_type == int:
return super().__contains__(key)
elif issubclass(key.__class__, Element):
return super().__contains__(key.get_id())
else:
raise ValueError(f"Not yet implemented for {key_type.__name__}")
class ElementList:
elements: list[SmartElement] = []
def __init__(self, list: list[SmartElement]) -> None:
self.elements = list
class SmartElementList(ElementList):
def get_id_series(self) -> IdSeries:
return IdSeries(el.get_id() for el in self.elements)
def __contains__(self, key) -> bool:
key_type = type(key)
if issubclass(key_type, SmartElement):
for el in self.elements:
if el.get_id() == key.get_id():
return True
return False
else:
raise ValueError(f"Not yet implemented for {key_type.__name__}")
def __getitem__(self, key) -> "SmartElementList":
key_type = type(key)
if key_type == int:
return self.__class__([self.elements[key]])
elif key_type == slice:
return self.__class__(self.elements[key])
elif key_type == IdSeries:
return self.__class__([el for el in self.elements if el in key])
elif issubclass(key.__class__, ElementList):
return self.__class__([el for el in self.elements if el in key])
else:
raise ValueError(f"Not yet implemented for {key_type.__name__}")
def __add__(self, __o: SmartElement) -> "SmartElementList":
key_type = type(__o)
if issubclass(key_type, SmartElement):
out = self.copy()
out.elements.append(__o)
return out
else:
raise ValueError(f"Not yet implemented for {key_type.__name__}")
def __sub__(self, __o: SmartElement) -> "SmartElementList":
key_type = type(__o)
if issubclass(key_type, SmartElement):
out_ids = self.get_id_series()
indx = out_ids.index(__o.get_id())
return self[IdSeries(out_ids[:indx] + out_ids[indx + 1 :])]
else:
raise ValueError(f"Not yet implemented for {key_type.__name__}")
def __eq__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el == __o)
def __ne__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el != __o)
def __gt__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el > __o)
def __lt__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el < __o)
def __ge__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el >= __o)
def __le__(self, __o: int) -> "IdSeries":
return IdSeries(el.get_id() for el in self.elements if el <= __o)
def eq(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el == __o])
def ne(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el != __o])
def gt(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el > __o])
def lt(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el < __o])
def ge(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el >= __o])
def le(self, __o: int | Element) -> "SmartElementList":
return self.__class__([el for el in self.elements if el <= __o])
def copy(self) -> "SmartElementList":
return self.__class__([copy(el) for el in self.elements])
def __mod__(self, __o: int) -> "SmartElementList":
out = []
for el in self.copy().elements:
el.ordering_value = el % __o
out.append(el)
return self.__class__(out)
def __str__(self) -> str:
return f"{[str(e) for e in self.elements]}"
def __repr__(self) -> str:
return f"{[repr(e) for e in self.elements]}"
def scramble(self) -> None:
random.seed(time_ns())
random.shuffle(self.elements)
def sort(self, reverse: bool = False) -> None:
self.elements.sort(reverse=reverse)
element_list = [
SmartElement(1, "Hey"),
SmartElement(2, "Hey"),
SmartElement(3, "You"),
SmartElement(4, "Hello"),
SmartElement(5, "Rock"),
SmartElement(6, "World"),
]
def _example():
elements = SmartElementList(element_list)
el = SmartElement(9, "Added later")
els = elements + el
print(els)
el2 = SmartElement(9, "Added later 2")
try:
els = els - el2
except ValueError:
print("Can't do that, those items have different ids!!")
print(f"{repr(el)} != {repr(el2)}")
els += el2
els -= el
print(els)
print(elements[elements % 2 == 1])
print(elements[elements == 1])
if __name__ == "__main__":
_example()