cool_shit.py
· 1.4 KiB · Python
Raw
from database import read
from reddit_scraper.utils import limit_iter
from typing import Iterable, Generic, TypeVar, List
T = TypeVar('T')
class CustomIter(Generic[T]):
def __init__(self, i: Iterable[T]) -> None:
self.i = i
self.l: List[T] = []
def _iter_leftover(self) -> Iterable[T]:
for j in self.i:
self.l.append(j)
yield j
def __len__(self):
list(self._iter_leftover())
return len(self.l)
def __iter__(self):
yield from self.l
yield from self._iter_leftover()
@property
def empty(self) -> bool:
if len(self.l):
return False
for _ in self._iter_leftover():
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:
if self.empty:
raise KeyError("can't get last element from empty list")
list(self._iter_leftover())
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)
| 1 | from database import read |
| 2 | |
| 3 | from reddit_scraper.utils import limit_iter |
| 4 | from typing import Iterable, Generic, TypeVar, List |
| 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 | |
| 15 | def _iter_leftover(self) -> Iterable[T]: |
| 16 | for j in self.i: |
| 17 | self.l.append(j) |
| 18 | yield j |
| 19 | |
| 20 | def __len__(self): |
| 21 | list(self._iter_leftover()) |
| 22 | return len(self.l) |
| 23 | |
| 24 | def __iter__(self): |
| 25 | yield from self.l |
| 26 | yield from self._iter_leftover() |
| 27 | |
| 28 | @property |
| 29 | def empty(self) -> bool: |
| 30 | if len(self.l): |
| 31 | return False |
| 32 | |
| 33 | for _ in self._iter_leftover(): |
| 34 | return False |
| 35 | |
| 36 | return True |
| 37 | |
| 38 | @property |
| 39 | def first(self) -> T: |
| 40 | if self.empty: |
| 41 | raise KeyError("can't get first element from empty list") |
| 42 | return self.l[0] |
| 43 | |
| 44 | @property |
| 45 | def last(self) -> T: |
| 46 | if self.empty: |
| 47 | raise KeyError("can't get last element from empty list") |
| 48 | |
| 49 | list(self._iter_leftover()) |
| 50 | return self.l[-1] |
| 51 | |
| 52 | |
| 53 | def test_iter(): |
| 54 | print("yield foo") |
| 55 | yield "foo" |
| 56 | print("yield bar") |
| 57 | yield "bar" |
| 58 | print("yield baz") |
| 59 | yield "baz" |
| 60 | |
| 61 | |
| 62 | if __name__ == "__main__": |
| 63 | ci: Iterable = CustomIter(test_iter()) |
| 64 | |
| 65 | for c in ci: |
| 66 | print(c) |
| 67 | break |
| 68 | |
| 69 | print("#" * 10) |
| 70 | for c in ci: |
| 71 | print(c) |