Skip to content

Commit fa655ca

Browse files
committed
better iterbetter (tx Emyr Thomas for the idea)
1 parent dea415e commit fa655ca

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

web/utils.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,13 +523,31 @@ class IterBetter:
523523
Traceback (most recent call last):
524524
...
525525
IndexError: already passed 3
526+
527+
For boolean test, IterBetter peeps at first value in the itertor without effecting the iteration.
528+
529+
>>> c = iterbetter(iter(range(5)))
530+
>>> bool(c)
531+
True
532+
>>> list(c)
533+
[0, 1, 2, 3, 4]
534+
>>> c = iterbetter(iter([]))
535+
>>> bool(c)
536+
False
537+
>>> list(c)
538+
[]
526539
"""
527540
def __init__(self, iterator):
528541
self.i, self.c = iterator, 0
542+
529543
def __iter__(self):
544+
if hasattr(self, "_head"):
545+
yield self._head
546+
530547
while 1:
531548
yield self.i.next()
532549
self.c += 1
550+
533551
def __getitem__(self, i):
534552
#todo: slices
535553
if i < self.c:
@@ -545,7 +563,18 @@ def __getitem__(self, i):
545563
raise IndexError, str(i)
546564

547565
def __nonzero__(self):
548-
return len(self) != 0
566+
if hasattr(self, "__len__"):
567+
return len(self) != 0
568+
elif hasattr(self, "_head"):
569+
return True
570+
else:
571+
try:
572+
self._head = self.i.next()
573+
except StopIteration:
574+
return False
575+
else:
576+
return True
577+
549578

550579
iterbetter = IterBetter
551580

0 commit comments

Comments
 (0)