Skip to content

Commit b51df0f

Browse files
committed
fix another groupby test
1 parent c821183 commit b51df0f

File tree

1 file changed

+37
-40
lines changed

1 file changed

+37
-40
lines changed

graalpython/lib-graalpython/itertools.py

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -593,74 +593,71 @@ class groupby(object):
593593
"""
594594
@__graalpython__.builtin_method
595595
def __init__(self, iterable, key=None):
596-
self._iterator = iter(iterable)
597-
self._keyfunc = key
598596
self._marker = object()
599597
self._tgtkey = self._currkey = self._currvalue = self._marker
598+
self._currgrouper = None
599+
self._keyfunc = key
600+
self._it = iter(iterable)
600601

601602
@__graalpython__.builtin_method
602603
def __iter__(self):
603604
return self
604605

605606
@__graalpython__.builtin_method
606607
def __next__(self):
607-
self._skip_to_next_iteration_group()
608-
key = self._tgtkey = self._currkey
609-
grouper = _grouper(self, key)
610-
return (key, grouper)
611-
612-
@__graalpython__.builtin_method
613-
def _skip_to_next_iteration_group(self):
608+
self._currgrouper = None
609+
marker = self._marker
614610
while True:
615-
if self._currkey is self._marker:
611+
if self._currkey is marker:
616612
pass
617-
elif self._tgtkey is self._marker:
613+
elif self._tgtkey is marker:
618614
break
619615
else:
620616
if not self._tgtkey == self._currkey:
621617
break
618+
self._groupby_step()
622619

623-
newvalue = next(self._iterator)
624-
if self._keyfunc is None:
625-
newkey = newvalue
626-
else:
627-
newkey = self._keyfunc(newvalue)
620+
self._tgtkey = self._currkey
621+
grouper = _grouper(self, self._tgtkey)
622+
return (self._currkey, grouper)
628623

629-
self._currkey = newkey
630-
self._currvalue = newvalue
624+
@__graalpython__.builtin_method
625+
def _groupby_step(self):
626+
newvalue = next(self._it)
627+
if self._keyfunc is None:
628+
newkey = newvalue
629+
else:
630+
newkey = self._keyfunc(newvalue)
631+
self._currvalue = newvalue
632+
self._currkey = newkey
631633

632634

633635
class _grouper():
634636
@__graalpython__.builtin_method
635-
def __init__(self, groupby, tgtkey):
636-
self.groupby = groupby
637-
self.tgtkey = tgtkey
638-
self._marker = groupby._marker
637+
def __init__(self, parent, tgtkey):
638+
if not isinstance(parent, groupby):
639+
raise TypeError("incorrect usage of internal _grouper")
640+
parent._currgouper = self
641+
self._parent = parent
642+
self._tgtkey = tgtkey
643+
self._marker = parent._marker
639644

640645
@__graalpython__.builtin_method
641646
def __iter__(self):
642647
return self
643648

644649
@__graalpython__.builtin_method
645650
def __next__(self):
646-
groupby = self.groupby
647-
if groupby._currvalue is self._marker:
648-
newvalue = next(groupby._iterator)
649-
if groupby._keyfunc is None:
650-
newkey = newvalue
651-
else:
652-
newkey = groupby._keyfunc(newvalue)
653-
assert groupby._currvalue is self._marker
654-
groupby._currkey = newkey
655-
groupby._currvalue = newvalue
656-
657-
assert groupby._currkey is not self._marker
658-
if not self.tgtkey == groupby._currkey:
659-
raise StopIteration(None)
660-
result = groupby._currvalue
661-
groupby._currvalue = self._marker
662-
groupby._currkey = self._marker
663-
return result
651+
gbo = self._parent
652+
if gbo._currgouper != self:
653+
raise StopIteration
654+
if gbo._currvalue is self._marker:
655+
gbo._groupby_step()
656+
if not (self._tgtkey == gbo._currkey):
657+
raise StopIteration
658+
r = gbo._currvalue
659+
gbo._currvalue = self._marker
660+
return r
664661

665662

666663
class combinations():

0 commit comments

Comments
 (0)