# HG changeset patch # Parent 6ce0668a03b4fbf3766df6a23bcfa637fabf6d4a 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 @@ -30,60 +30,59 @@ public class chain extends PyObject { public chain() { super(); } public chain(PyType subType) { super(subType); } - public chain(PyObject[] iterables) { + public chain(PyObject iterable) { super(); - chain___init__(iterables); + chain___init__(iterable.__iter__()); } @ExposedClassMethod public static final PyObject from_iterable(PyType type, PyObject iterable) { - ArrayList iterables = new ArrayList(); - for (PyObject i: iterable.asIterable()) { - iterables.add(i); - } - return new chain(iterables.toArray(new PyObject[iterables.size()])); + return new chain(iterable); } /** * 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()); + chain___init__(tuple.__iter__()); } - 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 superIterator) { iter = new itertools.ItertoolsIterator() { + int iteratorIndex = 0; + PyObject currentIterator = new PyObject(); public PyObject __iternext__() { + PyObject nextIterable; PyObject next = null; - for (; iteratorIndex < iterators.length; iteratorIndex++) { - next = nextElement(iterators[iteratorIndex]); + do { + next = nextElement(currentIterator); if (next != null) { break; } + } + while ((nextIterable = nextElement(superIterator)) != null && + (currentIterator = nextIterable.__iter__()) != null); return next; } }; } @ExposedMethod public PyObject __iter__() {