web/lib/django/utils/itercompat.py
changeset 38 77b6da96e6f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/utils/itercompat.py	Wed Jun 02 18:57:35 2010 +0200
@@ -0,0 +1,39 @@
+"""
+Providing iterator functions that are not in all version of Python we support.
+Where possible, we try to use the system-native version and only fall back to
+these implementations if necessary.
+"""
+
+import itertools
+
+# Fallback for Python 2.4, Python 2.5
+def product(*args, **kwds):
+    """
+    Taken from http://docs.python.org/library/itertools.html#itertools.product
+    """
+    # 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)
+
+if hasattr(itertools, 'product'):
+    product = itertools.product
+
+def is_iterable(x):
+    "A implementation independent way of checking for iterables"
+    try:
+        iter(x)
+    except TypeError:
+        return False
+    else:
+        return True
+
+def all(iterable):
+    for item in iterable:
+        if not item:
+            return False
+    return True