Skip to content

Commit fb4ee8d

Browse files
committed
fix most test_chain tests
1 parent 4f9659e commit fb4ee8d

File tree

1 file changed

+39
-16
lines changed

1 file changed

+39
-16
lines changed

graalpython/lib-graalpython/itertools.py

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,33 +70,56 @@ class chain():
7070
"""
7171
@__graalpython__.builtin_method
7272
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
7875

7976
@__graalpython__.builtin_method
8077
def __iter__(self):
8178
return self
8279

8380
@__graalpython__.builtin_method
8481
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
9594

9695
@classmethod
9796
@__graalpython__.builtin_method
9897
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")
100123

101124

102125
class starmap():

0 commit comments

Comments
 (0)