@@ -593,74 +593,71 @@ class groupby(object):
593
593
"""
594
594
@__graalpython__ .builtin_method
595
595
def __init__ (self , iterable , key = None ):
596
- self ._iterator = iter (iterable )
597
- self ._keyfunc = key
598
596
self ._marker = object ()
599
597
self ._tgtkey = self ._currkey = self ._currvalue = self ._marker
598
+ self ._currgrouper = None
599
+ self ._keyfunc = key
600
+ self ._it = iter (iterable )
600
601
601
602
@__graalpython__ .builtin_method
602
603
def __iter__ (self ):
603
604
return self
604
605
605
606
@__graalpython__ .builtin_method
606
607
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
614
610
while True :
615
- if self ._currkey is self . _marker :
611
+ if self ._currkey is marker :
616
612
pass
617
- elif self ._tgtkey is self . _marker :
613
+ elif self ._tgtkey is marker :
618
614
break
619
615
else :
620
616
if not self ._tgtkey == self ._currkey :
621
617
break
618
+ self ._groupby_step ()
622
619
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 )
628
623
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
631
633
632
634
633
635
class _grouper ():
634
636
@__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
639
644
640
645
@__graalpython__ .builtin_method
641
646
def __iter__ (self ):
642
647
return self
643
648
644
649
@__graalpython__ .builtin_method
645
650
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
664
661
665
662
666
663
class combinations ():
0 commit comments