web/lib/django/utils/itercompat.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
--- a/web/lib/django/utils/itercompat.py	Wed May 19 17:43:59 2010 +0200
+++ b/web/lib/django/utils/itercompat.py	Tue May 25 02:43:45 2010 +0200
@@ -6,57 +6,22 @@
 
 import itertools
 
-def compat_tee(iterable):
-    """
-    Return two independent iterators from a single iterable.
-
-    Based on http://www.python.org/doc/2.3.5/lib/itertools-example.html
+# Fallback for Python 2.4, Python 2.5
+def product(*args, **kwds):
     """
-    # Note: Using a dictionary and a list as the default arguments here is
-    # deliberate and safe in this instance.
-    def gen(next, data={}, cnt=[0]):
-        dpop = data.pop
-        for i in itertools.count():
-            if i == cnt[0]:
-                item = data[i] = next()
-                cnt[0] += 1
-            else:
-                item = dpop(i)
-            yield item
-    next = iter(iterable).next
-    return gen(next), gen(next)
-
-def groupby(iterable, keyfunc=None):
-    """
-    Taken from http://docs.python.org/lib/itertools-functions.html
+    Taken from http://docs.python.org/library/itertools.html#itertools.product
     """
-    if keyfunc is None:
-        keyfunc = lambda x:x
-    iterable = iter(iterable)
-    l = [iterable.next()]
-    lastkey = keyfunc(l[0])
-    for item in iterable:
-        key = keyfunc(item)
-        if key != lastkey:
-            yield lastkey, l
-            lastkey = key
-            l = [item]
-        else:
-            l.append(item)
-    yield lastkey, l
+    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
+    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
+    pools = map(tuple, args) * kwds.get('repeat', 1)
+    result = [[]]
+    for pool in pools:
+        result = [x+[y] for x in result for y in pool]
+    for prod in result:
+        yield tuple(prod)
 
-# Not really in itertools, since it's a builtin in Python 2.4 and later, but it
-# does operate as an iterator.
-def reversed(data):
-    for index in xrange(len(data)-1, -1, -1):
-        yield data[index]
-
-if hasattr(itertools, 'tee'):
-    tee = itertools.tee
-else:
-    tee = compat_tee
-if hasattr(itertools, 'groupby'):
-    groupby = itertools.groupby
+if hasattr(itertools, 'product'):
+    product = itertools.product
 
 def is_iterable(x):
     "A implementation independent way of checking for iterables"
@@ -67,9 +32,8 @@
     else:
         return True
 
-def sorted(in_value):
-    "A naive implementation of sorted"
-    out_value = in_value[:]
-    out_value.sort()
-    return out_value
-
+def all(iterable):
+    for item in iterable:
+        if not item:
+            return False
+    return True