cool_shit.py
· 1.8 KiB · Python
Raw
from database import read
from reddit_scraper.utils import limit_iter
from typing import Iterable, Generic, TypeVar, List, Iterator
T = TypeVar('T')
class CustomIter(Generic[T]):
def __init__(self, i: Iterable[T]) -> None:
self.i = i
self.l: List[T] = []
self.is_generated = False
# if i doesn't have __next__ pre generate it as it is not lazy
if not isinstance(self.i, Iterator):
self.generate()
def generate(self):
if not self.is_generated:
self.l.extend(self.i)
self.is_generated = True
def __len__(self):
self.generate()
return len(self.l)
def __iter__(self):
yield from self.l
if not self.is_generated:
for j in self.i:
self.l.append(j)
yield j
self.is_generated = True
@property
def empty(self) -> bool:
if len(self.l):
return False
if not self.is_generated:
for j in self.i:
self.l.append(j)
return False
return True
@property
def first(self) -> T:
if self.empty:
raise KeyError("can't get first element from empty list")
return self.l[0]
@property
def last(self) -> T:
self.generate()
if not len(self.l):
raise KeyError("can't get last element from empty list")
return self.l[-1]
def test_iter():
print("yield foo")
yield "foo"
print("yield bar")
yield "bar"
print("yield baz")
yield "baz"
if __name__ == "__main__":
ci: Iterable = CustomIter(test_iter())
for c in ci:
print(c)
break
print("#" * 10)
for c in ci:
print(c)
print("#" * 10)
for c in ci:
print(c)
| 1 | from database import read |
| 2 | |
| 3 | from reddit_scraper.utils import limit_iter |
| 4 | from typing import Iterable, Generic, TypeVar, List, Iterator |
| 5 | |
| 6 | |
| 7 | T = TypeVar('T') |
| 8 | |
| 9 | |
| 10 | class 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 | |
| 67 | def 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 | |
| 76 | if __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) |