diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h
index ba3b4f4aad8018ebc53fb381c06ee5e5aa432d83..b80d2aa33b3466304222107bf5c4a11a3ea2badb 100644
--- a/src/libs/utils/algorithm.h
+++ b/src/libs/utils/algorithm.h
@@ -394,6 +394,31 @@ std::tuple<C, C> partition(const C &container, R (S::*predicate)() const)
     return partition(container, std::mem_fn(predicate));
 }
 
+//////////////////
+// filteredUnique
+/////////////////
+
+template<typename C>
+Q_REQUIRED_RESULT
+C filteredUnique(const C &container)
+{
+    C result;
+    auto ins = inserter(result);
+
+    QSet<typename C::value_type> seen;
+    int setSize = 0;
+
+    auto endIt = container.end();
+    for (auto it = container.begin(); it != endIt; ++it) {
+        seen.insert(*it);
+        if (setSize == seen.size()) // unchanged size => was already seen
+            continue;
+        ++setSize;
+        ins = *it;
+    }
+    return result;
+}
+
 //////////////////
 // sort
 /////////////////