Source code for bi_etl.utility.case_insentive_set
from collections.abc import MutableSet
[docs]class CaseInsentiveSet(MutableSet):
"""
Implements a case-insensitive set while still preserving the case of the first instance of each item.
"""
[docs] def __init__(self, values):
self._values = {}
for v in values:
self.add(v)
def __repr__(self):
return f'<{type(self).__name__}{tuple(self._values.values())} @ {id(self):x}>'
def __contains__(self, value: str):
return value.casefold() in self._values
def __iter__(self):
return iter(self._values.values())
def __len__(self):
return len(self._values)
[docs] def add(self, value: str):
value_key = value.casefold()
if value_key not in self._values:
self._values[value_key] = value
[docs] def discard(self, value: str):
try:
del self._values[value.casefold()]
except KeyError:
pass