Source code for hwt.pyUtils.setDeque

from collections import deque
from typing import Generic, TypeVar, Sequence, Optional, Union

T = TypeVar('T')


[docs] class SetDeque(Generic[T], deque): """ Deque of unique items :see: https://docs.python.org/3/tutorial/datastructures.html """ __slots__ = ["__s"]
[docs] def __init__(self, initSeq: Optional[Sequence[T]]=None): super(SetDeque, self).__init__() self.__s: set[T] = set() if initSeq is not None: for item in initSeq: self.append(item)
[docs] def append(self, item: T) -> bool: """ :return: True if the item was newly added """ if item in self.__s: return False else: self.__s.add(item) deque.append(self, item) return True
[docs] def extend(self, items: Sequence[T]): if self is items: return # will not add any item because all items are already there for item in items: self.append(item)
[docs] def insert(self, i: int, x: T): super(SetDeque, self).insert(i, x) self.__s.add(x)
[docs] def _get_set(self) -> set[T]: return self.__s
[docs] def intersection_set(self, other: set[T]): return self.__s.intersection(other._get_set())
[docs] def discard(self, item: T) -> bool: """ :return: True if the item was previously in this deque """ if item in self.__s: self.remove(item) return True else: return False
[docs] def remove(self, item: T): # To raise ValueError instead of KeyError for set res = deque.remove(self, item) self.__s.remove(item) return res
[docs] def pop(self, *args, **kwargs) -> T: item = deque.pop(self, *args, **kwargs) self.__s.remove(item) return item
[docs] def popleft(self) -> T: item = deque.popleft(self) self.__s.remove(item) return item
[docs] def clear(self): deque.clear(self) self.__s.clear()
[docs] def copy(self): c = SetDeque() c.extend(self) return c
def __setitem__(self, i: Union[int, slice], v: Union[T, Sequence[T]]): if isinstance(i, slice): if i.start is None and i.step is None and i.stop is None: self.clear() self.extend(v) else: for item in self[i]: self.__s.remove(item) v = SetDeque(v) deque.__setitem__(self, i, v) self.__s.update(v) else: assert isinstance(i, int) cur = self[i] self.__s.remove(cur) deque.__setitem__(self, i, v) self.__s.add(v) def __copy__(self): return self.copy() def __contains__(self, key) -> bool: return key in self.__s