@@ -70,33 +70,56 @@ class chain():
70
70
"""
71
71
@__graalpython__ .builtin_method
72
72
def __init__ (self , * iterables ):
73
- self ._iterables = iterables
74
- self ._len = len (iterables )
75
- if self ._len > 0 :
76
- self ._current = iter (self ._iterables [0 ])
77
- self ._idx = 0
73
+ self ._source = iter (iterables )
74
+ self ._active = None
78
75
79
76
@__graalpython__ .builtin_method
80
77
def __iter__ (self ):
81
78
return self
82
79
83
80
@__graalpython__ .builtin_method
84
81
def __next__ (self ):
85
- if self ._idx >= self ._len :
86
- raise StopIteration
87
- try :
88
- return next (self ._current )
89
- except (StopIteration , IndexError ):
90
- self ._idx += 1
91
- if self ._idx >= self ._len :
92
- raise StopIteration
93
- self ._current = iter (self ._iterables [self ._idx ])
94
- return self .__next__ ()
82
+ while self ._source :
83
+ if not self ._active :
84
+ try :
85
+ self ._active = iter (next (self ._source ))
86
+ except :
87
+ self ._source = None
88
+ raise
89
+ try :
90
+ return next (self ._active )
91
+ except StopIteration :
92
+ self ._active = None
93
+ raise StopIteration
95
94
96
95
@classmethod
97
96
@__graalpython__ .builtin_method
98
97
def from_iterable (cls , arg ):
99
- return cls (* iter (arg ))
98
+ instance = cls ()
99
+ instance ._source = iter (arg )
100
+ return instance
101
+
102
+ @__graalpython__ .builtin_method
103
+ def __reduce__ (self ):
104
+ if self ._source :
105
+ if self ._active :
106
+ return type (self ), (), (self ._source , self ._active )
107
+ else :
108
+ return type (self ), (), (self ._source ,)
109
+ else :
110
+ return type (self ), ()
111
+
112
+ @__graalpython__ .builtin_method
113
+ def __setstate__ (self , state ):
114
+ if not isinstance (state , tuple ) or len (state ) not in [1 ,2 ]:
115
+ raise TypeError ("state is not a length 1 or 2 tuple" )
116
+ self ._source = state [0 ]
117
+ if not getattr (self ._source , "__next__" , None ):
118
+ raise TypeError ("Arguments must be iterators" )
119
+ if len (state ) == 2 :
120
+ self ._active = state [1 ]
121
+ if not getattr (self ._active , "__next__" , None ):
122
+ raise TypeError ("Arguments must be iterators" )
100
123
101
124
102
125
class starmap ():
0 commit comments