[pypy-svn] r56450 - in pypy/dist/pypy/module/itertools: . test
adurdin at codespeak.net
adurdin at codespeak.net
Fri Jul 11 15:40:17 CEST 2008
Author: adurdin
Date: Fri Jul 11 15:40:15 2008
New Revision: 56450
Modified:
pypy/dist/pypy/module/itertools/__init__.py
pypy/dist/pypy/module/itertools/interp_itertools.py
pypy/dist/pypy/module/itertools/test/test_itertools.py
Log:
(adurdin, jlg) interp_itertools - added cycle()
Modified: pypy/dist/pypy/module/itertools/__init__.py
==============================================================================
--- pypy/dist/pypy/module/itertools/__init__.py (original)
+++ pypy/dist/pypy/module/itertools/__init__.py Fri Jul 11 15:40:15 2008
@@ -25,16 +25,17 @@
"""
interpleveldefs = {
- 'chain' : 'interp_itertools.W_Chain',
- 'count' : 'interp_itertools.W_Count',
- 'dropwhile' : 'interp_itertools.W_DropWhile',
- 'ifilter' : 'interp_itertools.W_IFilter',
- 'ifilterfalse' : 'interp_itertools.W_IFilterFalse',
- 'imap' : 'interp_itertools.W_IMap',
- 'islice' : 'interp_itertools.W_ISlice',
- 'izip' : 'interp_itertools.W_IZip',
- 'repeat' : 'interp_itertools.W_Repeat',
- 'takewhile' : 'interp_itertools.W_TakeWhile',
+ 'chain' : 'interp_itertools.W_Chain',
+ 'count' : 'interp_itertools.W_Count',
+ 'cycle' : 'interp_itertools.W_Cycle',
+ 'dropwhile' : 'interp_itertools.W_DropWhile',
+ 'ifilter' : 'interp_itertools.W_IFilter',
+ 'ifilterfalse' : 'interp_itertools.W_IFilterFalse',
+ 'imap' : 'interp_itertools.W_IMap',
+ 'islice' : 'interp_itertools.W_ISlice',
+ 'izip' : 'interp_itertools.W_IZip',
+ 'repeat' : 'interp_itertools.W_Repeat',
+ 'takewhile' : 'interp_itertools.W_TakeWhile',
}
appleveldefs = {
Modified: pypy/dist/pypy/module/itertools/interp_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/interp_itertools.py (original)
+++ pypy/dist/pypy/module/itertools/interp_itertools.py Fri Jul 11 15:40:15 2008
@@ -541,3 +541,46 @@
""")
W_IZip.typedef.acceptable_as_base_class = False
+
+class W_Cycle(Wrappable):
+
+ def __init__(self, space, w_iterable):
+ self.space = space
+ self.saved_w = []
+ self.w_iterable = space.iter(w_iterable)
+ self.saved_iterator = None
+ self.exhausted = False
+
+ def next_w(self):
+ if self.exhausted:
+ if not self.saved_w:
+ raise OperationError(self.space.w_StopIteration, self.space.w_None)
+ try:
+ w_obj = self.saved_iterator.next()
+ except StopIteration:
+ self.saved_iterator = iter(self.saved_w)
+ w_obj = self.saved_iterator.next()
+ else:
+ try:
+ w_obj = self.space.next(self.w_iterable)
+ except OperationError, e:
+ if e.match(self.space, self.space.w_StopIteration):
+ self.exhausted = True
+ if not self.saved_w:
+ raise
+ self.saved_iterator = iter(self.saved_w)
+ w_obj = self.saved_iterator.next()
+ else:
+ raise
+ else:
+ self.saved_w.append(w_obj)
+ return w_obj
+
+def W_Cycle___new__(space, w_subtype, w_iterable):
+ return space.wrap(W_Cycle(space, w_iterable))
+
+W_Cycle.typedef = TypeDef(
+ 'cycle',
+ __new__ = interp2app(W_Cycle___new__, unwrap_spec=[ObjSpace, W_Root, W_Root]),
+ next = interp2app(W_Cycle.next_w, unwrap_spec=['self']))
+W_Cycle.typedef.acceptable_as_base_class = False
Modified: pypy/dist/pypy/module/itertools/test/test_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/test/test_itertools.py (original)
+++ pypy/dist/pypy/module/itertools/test/test_itertools.py Fri Jul 11 15:40:15 2008
@@ -368,6 +368,17 @@
else:
fail("TypeError expected")
+ def test_cycle(self):
+ import itertools
+
+ it = itertools.cycle([])
+ raises(StopIteration, it.next)
+
+ it = itertools.cycle([1, 2, 3])
+ for x in [1, 2, 3, 1, 2, 3, 1, 2, 3]:
+ assert it.next() == x
+
+
def test_docstrings(self):
import itertools
More information about the Pypy-commit
mailing list