# HG changeset patch # Parent 677a8e47f2c85598d588d6404c8a09f44a331544 diff --git a/src/org/python/modules/itertools/chain.java b/src/org/python/modules/itertools/chain.java --- a/src/org/python/modules/itertools/chain.java +++ b/src/org/python/modules/itertools/chain.java @@ -15,16 +15,17 @@ import org.python.expose.ExposedType; import java.util.ArrayList; @ExposedType(name = "itertools.chain", base = PyObject.class) public class chain extends PyObject { public static final PyType TYPE = PyType.fromClass(chain.class); private itertools.ItertoolsIterator iter; + private PyObject currentIterator; @ExposedGet public static PyString __doc__ = new PyString( "chain(*iterables) --> chain object\n\nReturn a chain object " + "whose .next() method returns elements from the\nfirst iterable until it is exhausted, then elements" + " from the next\niterable, until all of the iterables are exhausted."); public chain() { @@ -57,33 +58,31 @@ public class chain extends PyObject { final void chain___init__(final PyObject[] args, String[] kwds) { ArgParser ap = new ArgParser("chain", args, kwds, "iterables"); //ArgParser always returns a PyTuple - I wonder why we make it pass back a PyObject? PyTuple tuple = (PyTuple)ap.getList(0); chain___init__(tuple.getArray()); } - private void chain___init__(PyObject[] iterables) { - final PyObject[] iterators = new PyObject[iterables.length]; - for (int i = 0; i < iterables.length; i++) { - iterators[i] = iterables[i].__iter__(); - } - + private void chain___init__(final PyObject[] iterables) { + currentIterator = new PyObject(); iter = new itertools.ItertoolsIterator() { int iteratorIndex = 0; public PyObject __iternext__() { PyObject next = null; - for (; iteratorIndex < iterators.length; iteratorIndex++) { - next = nextElement(iterators[iteratorIndex]); + do { + next = nextElement(currentIterator); if (next != null) { break; } } + while (iteratorIndex < iterables.length && + (currentIterator = iterables[iteratorIndex++].__iter__()) != null); return next; } }; } @ExposedMethod public PyObject __iter__() {