From f7414041f6ae1e39651acd0d0f3169b3a9e475ee Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Tue, 20 Nov 2007 09:17:58 +0000
Subject: [PATCH] Add function to return list with unique elements.

Reviewed-by: ultrotter
---
 lib/utils.py                  |  9 +++++++++
 test/ganeti.utils_unittest.py | 23 +++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/lib/utils.py b/lib/utils.py
index 73d1bbb8e..f9f5f1b39 100644
--- a/lib/utils.py
+++ b/lib/utils.py
@@ -1002,3 +1002,12 @@ def any(seq, pred=bool):
   for elem in itertools.ifilter(pred, seq):
     return True
   return False
+
+
+def UniqueSequence(seq):
+  """Returns a list with unique elements.
+
+  Element order is preserved.
+  """
+  seen = set()
+  return [i for i in seq if i not in seen and not seen.add(i)]
diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py
index 88920671a..8ec8be070 100755
--- a/test/ganeti.utils_unittest.py
+++ b/test/ganeti.utils_unittest.py
@@ -608,5 +608,28 @@ class TestNewUUID(unittest.TestCase):
     self.failUnless(self._re_uuid.match(utils.NewUUID()))
 
 
+class TestUniqueSequence(unittest.TestCase):
+  """Test case for UniqueSequence"""
+
+  def _test(self, input, expected):
+    self.assertEqual(utils.UniqueSequence(input), expected)
+
+  def runTest(self):
+    # Ordered input
+    self._test([1, 2, 3], [1, 2, 3])
+    self._test([1, 1, 2, 2, 3, 3], [1, 2, 3])
+    self._test([1, 2, 2, 3], [1, 2, 3])
+    self._test([1, 2, 3, 3], [1, 2, 3])
+
+    # Unordered input
+    self._test([1, 2, 3, 1, 2, 3], [1, 2, 3])
+    self._test([1, 1, 2, 3, 3, 1, 2], [1, 2, 3])
+
+    # Strings
+    self._test(["a", "a"], ["a"])
+    self._test(["a", "b"], ["a", "b"])
+    self._test(["a", "b", "a"], ["a", "b"])
+
+
 if __name__ == '__main__':
   unittest.main()
-- 
GitLab