Browse Source

utils: Add unique_everseen (from itertools recipies).

Signed-off-by: Antony MECHIN <[email protected]>
Antony MECHIN 7 years ago
parent
commit
de1958c5ff
2 changed files with 15 additions and 0 deletions
  1. 9 0
      compose/utils.py
  2. 6 0
      tests/unit/utils_test.py

+ 9 - 0
compose/utils.py

@@ -170,3 +170,12 @@ def truncate_id(value):
     if len(value) > 12:
         return value[:12]
     return value
+
+
+def unique_everseen(iterable, key=lambda x: x):
+    "List unique elements, preserving order. Remember all elements ever seen."
+    seen = set()
+    for element in iterable:
+        if key(element) not in seen:
+            seen.add(element)
+            yield element

+ 6 - 0
tests/unit/utils_test.py

@@ -68,3 +68,9 @@ class TestParseBytes(object):
         assert utils.parse_bytes(123) == 123
         assert utils.parse_bytes('foobar') is None
         assert utils.parse_bytes('123') == 123
+
+
+class TestMoreItertools(object):
+    def test_unique_everseen(self):
+        assert list(utils.unique_everseen([2, 1, 2, 1])) == [2, 1]
+        assert list(utils.unique_everseen([2, 1, 2, 1], hash)) == [2, 1]