diff --git a/src/lol/base/array.h b/src/lol/base/array.h
index 3029c883..9ea64634 100644
--- a/src/lol/base/array.h
+++ b/src/lol/base/array.h
@@ -26,6 +26,8 @@
 namespace lol
 {
 
+#define INDEX_NONE -1
+
 /*
  * The base array type.
  *
@@ -167,11 +169,70 @@ public:
         return *this;
     }
 
+    inline ArrayBase& operator>>(T const &x)
+    {
+        RemoveItem(x);
+        return *this;
+    }
+
     inline void Push(T const &x)
     {
         *this << x;
     }
 
+    inline bool PushUnique(T const &x)
+    {
+        int idx = Find(x);
+        if (idx == INDEX_NONE)
+        {
+            Push(x);
+            return true;
+        }
+        return false;
+    }
+
+    inline int Find(T const &x)
+    {
+        for (int i = 0; i < m_count; ++i)
+            if (x == m_data[i])
+                return i;
+        return INDEX_NONE;
+    }
+
+    bool RemoveItem(T const &x)
+    {
+        int idx = Find(x);
+        if (idx != INDEX_NONE)
+        {
+            Remove(idx);
+            return true;
+        }
+        return false;
+    }
+
+    bool RemoveSwapItem(T const &x)
+    {
+        int idx = Find(x);
+        if (idx != INDEX_NONE)
+        {
+            RemoveSwap(idx);
+            return true;
+        }
+        return false;
+    }
+
+    bool SwapItem(T const &x1, T const &x2)
+    {
+        int idx1 = Find(x1);
+        int idx2 = Find(x2);
+        if (idx1 != INDEX_NONE && idx2 != INDEX_NONE)
+        {
+            Swap(idx1, idx2);
+            return true;
+        }
+        return false;
+    }
+
     inline T Pop()
     {
         ASSERT(m_count > 0);