@@ -935,34 +935,51 @@ def __init__(self, iterable):
935
935
self .saved = []
936
936
self .iterable = iter (iterable )
937
937
self .index = 0
938
+ self .firstpass = False
938
939
939
940
@__graalpython__ .builtin_method
940
941
def __iter__ (self ):
941
942
return self
942
943
943
944
@__graalpython__ .builtin_method
944
945
def __next__ (self ):
945
- if self .index > 0 :
946
- if not self .saved :
947
- raise StopIteration
948
- if len (self .saved ) > self .index :
949
- obj = self .saved [self .index ]
950
- self .index += 1
951
- else :
952
- obj = self .saved [0 ]
953
- self .index = 1
954
- else :
946
+ if self .iterable :
955
947
try :
956
948
obj = next (self .iterable )
957
949
except StopIteration :
958
- if not self .saved :
959
- raise
960
- obj = self .saved [0 ]
961
- self .index = 1
950
+ self .iterable = None
962
951
else :
963
- self .saved .append (obj )
952
+ if not self .firstpass :
953
+ self .saved .append (obj )
954
+ return obj
955
+ if not self .saved :
956
+ raise StopIteration
957
+ obj = self .saved [self .index ]
958
+ self .index += 1
959
+ if self .index >= len (self .saved ):
960
+ self .index = 0
964
961
return obj
965
962
963
+ @__graalpython__ .builtin_method
964
+ def __reduce__ (self ):
965
+ if self .iterable is None :
966
+ it = iter (self .saved )
967
+ if self .index :
968
+ it .__setstate__ (self .index )
969
+ return type (self ), (it ,), (self .saved , True )
970
+ return type (self ), (self .iterable ,), (self .saved , self .firstpass )
971
+
972
+ @__graalpython__ .builtin_method
973
+ def __setstate__ (self , state ):
974
+ if (not isinstance (state , tuple ) or
975
+ len (state ) != 2 or
976
+ not isinstance (state [0 ], list ) or
977
+ not isinstance (state [1 ], int )):
978
+ raise TypeError ("invalid state tuple" )
979
+ self .saved = state [0 ]
980
+ self .firstpass = state [1 ]
981
+ self .index = 0
982
+
966
983
967
984
class compress ():
968
985
"""Make an iterator that filters elements from *data* returning
0 commit comments