# 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 @@ -51,39 +51,40 @@ public class chain extends PyObject { /** * Creates an iterator that iterates over a chain of iterables. */ @ExposedNew @ExposedMethod final void chain___init__(final PyObject[] args, String[] kwds) { ArgParser ap = new ArgParser("chain", args, kwds, "iterables"); + ap.noKeywords(); //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) { iter = new itertools.ItertoolsIterator() { + int iteratorIndex = 0; + PyObject currentIterator = new PyObject(); 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__() {