Source code for hwt.pyUtils.uniqList

from typing import Generic, TypeVar, Set, Sequence, Optional

T = TypeVar('T')


[docs]class UniqList(Generic[T], list): """ List of unique items """ __slots__ = ["__s"]
[docs] def __init__(self, initSeq: Optional[Sequence[T]]=None): super(UniqList, 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 in list already """ if item in self.__s: return False else: self.__s.add(item) list.append(self, item) return True
[docs] def extend(self, items: Sequence[T]): for item in items: self.append(item)
[docs] def insert(self, i: int, x: T): super(UniqList, 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 in list already """ if item in self.__s: self.remove(item) return True else: return False
[docs] def remove(self, item: T): self.__s.remove(item) return list.remove(self, item)
[docs] def pop(self, *args, **kwargs) -> T: item = list.pop(self, *args, **kwargs) self.__s.remove(item) return item
[docs] def clear(self): list.clear(self) self.__s.clear()
[docs] def copy(self): c = UniqList() c.extend(self) return c
def __setitem__(self, i: int, v: T): if isinstance(i, slice): for item in self[i]: self.__s.remove(item) v = UniqList(v) list.__setitem__(self, i, v) self.__s.update(v) else: assert isinstance(i, int) cur = self[i] self.__s.remove(cur) list.__setitem__(self, i, v) self.__s.add(v) def __copy__(self): return self.copy() def __contains__(self, key) -> bool: return key in self.__s