adjust/rewrite code to fix https://bugs.libre-soc.org/show_bug.cgi?id=706
[utils.git] / src / budget_sync / ordered_set.py
diff --git a/src/budget_sync/ordered_set.py b/src/budget_sync/ordered_set.py
new file mode 100644 (file)
index 0000000..ce52e29
--- /dev/null
@@ -0,0 +1,31 @@
+from typing import Any, Dict, Iterable, Iterator, MutableSet, Optional, TypeVar
+
+__all__ = ['OrderedSet']
+_T_co = TypeVar('_T_co')
+
+
+class OrderedSet(MutableSet[_T_co]):
+    __map: Dict[_T_co, None]
+
+    def __init__(self, iterable: Iterable[_T_co] = ()):
+        self.__map = {i: None for i in iterable}
+
+    def __len__(self) -> int:
+        return len(self.__map)
+
+    def __contains__(self, key: Any) -> bool:
+        return key in self.__map
+
+    def add(self, key: _T_co):
+        self.__map[key] = None
+
+    def discard(self, key: Any):
+        self.__map.pop(key, None)
+
+    def __iter__(self) -> Iterator[_T_co]:
+        return iter(self.__map.keys())
+
+    def __repr__(self) -> str:
+        if len(self) == 0:
+            return "OrderedSet()"
+        return f"OrderedSet({list(self)!r})"