Add portage.util.unique_everseen
authorSebastian Luther <SebastianLuther@gmx.de>
Thu, 9 Sep 2010 09:13:08 +0000 (11:13 +0200)
committerZac Medico <zmedico@gentoo.org>
Thu, 9 Sep 2010 11:30:37 +0000 (04:30 -0700)
    List unique elements, preserving order. Remember all elements ever seen.
    Taken from itertools documentation.

pym/portage/util/__init__.py

index ae1d6febb1de1fe4db89e69d0609eac6e7ebd6ca..2a2597b1a9756225c412661d8f563ef52fc538a7 100644 (file)
@@ -8,12 +8,13 @@ __all__ = ['apply_permissions', 'apply_recursive_permissions',
        'grabdict_package', 'grabfile', 'grabfile_package', 'grablines',
        'initialize_logger', 'LazyItemsDict', 'map_dictlist_vals',
        'new_protect_filename', 'normalize_path', 'pickle_read', 'stack_dictlist',
-       'stack_dicts', 'stack_lists', 'unique_array', 'varexpand', 'write_atomic',
-       'writedict', 'writemsg', 'writemsg_level', 'writemsg_stdout']
+       'stack_dicts', 'stack_lists', 'unique_array', 'unique_everseen', 'varexpand',
+       'write_atomic', 'writedict', 'writemsg', 'writemsg_level', 'writemsg_stdout']
 
 import codecs
 from copy import deepcopy
 import errno
+from itertools import ifilterfalse
 import logging
 import re
 import shlex
@@ -726,6 +727,26 @@ def unique_array(s):
                        u.append(x)
        return u
 
+def unique_everseen(iterable, key=None):
+    """
+    List unique elements, preserving order. Remember all elements ever seen.
+    Taken from itertools documentation.
+    """
+    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
+    # unique_everseen('ABBCcAD', str.lower) --> A B C D
+    seen = set()
+    seen_add = seen.add
+    if key is None:
+        for element in ifilterfalse(seen.__contains__, iterable):
+            seen_add(element)
+            yield element
+    else:
+        for element in iterable:
+            k = key(element)
+            if k not in seen:
+                seen_add(k)
+                yield element
+
 def apply_permissions(filename, uid=-1, gid=-1, mode=-1, mask=-1,
        stat_cached=None, follow_links=True):
        """Apply user, group, and mode bits to a file if the existing bits do not