add new binutils 1259 grant temporary name
[utils.git] / src / budget_sync / ordered_set.py
1 from typing import Any, Dict, Iterable, Iterator, MutableSet, Optional, TypeVar
2
3 __all__ = ['OrderedSet']
4 _T_co = TypeVar('_T_co')
5
6
7 class OrderedSet(MutableSet[_T_co]):
8 __map: Dict[_T_co, None]
9
10 def __init__(self, iterable: Iterable[_T_co] = ()):
11 self.__map = {i: None for i in iterable}
12
13 def __len__(self) -> int:
14 return len(self.__map)
15
16 def __contains__(self, key: Any) -> bool:
17 return key in self.__map
18
19 def add(self, key: _T_co):
20 self.__map[key] = None
21
22 def discard(self, key: Any):
23 self.__map.pop(key, None)
24
25 def __iter__(self) -> Iterator[_T_co]:
26 return iter(self.__map.keys())
27
28 def __repr__(self) -> str:
29 if len(self) == 0:
30 return "OrderedSet()"
31 return f"OrderedSet({list(self)!r})"