[Jython-checkins] jython: Make check for iterability in chain() arguments lazy.

frank.wierzbicki jython-checkins at python.org
Thu Jun 21 21:53:30 CEST 2012


http://hg.python.org/jython/rev/237b9e04f292
changeset:   6728:237b9e04f292
user:        Jez Ng <jezreel at gmail.com>
date:        Thu Jun 21 12:31:20 2012 -0700
summary:
  Make check for iterability in chain() arguments lazy.

files:
  src/org/python/modules/itertools/chain.java |  29 ++++-----
  1 files changed, 14 insertions(+), 15 deletions(-)


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
@@ -35,18 +35,14 @@
         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<PyObject> iterables = new ArrayList<PyObject>();
-        for (PyObject i: iterable.asIterable()) {
-            iterables.add(i);
-        }
-        return new chain(iterables.toArray(new PyObject[iterables.size()]));
+        return new chain(iterable);
     }
 
     /**
@@ -56,29 +52,32 @@
     @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;
             }
 

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list