Last active 1755265730

cool_shit.py Raw
1from database import read
2
3from reddit_scraper.utils import limit_iter
4from typing import Iterable, Generic, TypeVar, List, Iterator
5
6
7T = TypeVar('T')
8
9
10class CustomIter(Generic[T]):
11 def __init__(self, i: Iterable[T]) -> None:
12 self.i = i
13 self.l: List[T] = []
14 self.is_generated = False
15
16 # if i doesn't have __next__ pre generate it as it is not lazy
17 if not isinstance(self.i, Iterator):
18 self.generate()
19
20 def generate(self):
21 if not self.is_generated:
22 self.l.extend(self.i)
23 self.is_generated = True
24
25 def __len__(self):
26 self.generate()
27 return len(self.l)
28
29 def __iter__(self):
30 yield from self.l
31
32 if not self.is_generated:
33 for j in self.i:
34 self.l.append(j)
35 yield j
36 self.is_generated = True
37
38
39 @property
40 def empty(self) -> bool:
41 if len(self.l):
42 return False
43
44 if not self.is_generated:
45 for j in self.i:
46 self.l.append(j)
47 return False
48
49 return True
50
51 @property
52 def first(self) -> T:
53 if self.empty:
54 raise KeyError("can't get first element from empty list")
55 return self.l[0]
56
57 @property
58 def last(self) -> T:
59 self.generate()
60
61 if not len(self.l):
62 raise KeyError("can't get last element from empty list")
63
64 return self.l[-1]
65
66
67def test_iter():
68 print("yield foo")
69 yield "foo"
70 print("yield bar")
71 yield "bar"
72 print("yield baz")
73 yield "baz"
74
75
76if __name__ == "__main__":
77 ci: Iterable = CustomIter(test_iter())
78
79 for c in ci:
80 print(c)
81 break
82
83 print("#" * 10)
84 for c in ci:
85 print(c)
86
87 print("#" * 10)
88 for c in ci:
89 print(c)