[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