diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/openpyxl/utils/indexed_list.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/openpyxl/utils/indexed_list.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/openpyxl/utils/indexed_list.py b/.venv/lib/python3.12/site-packages/openpyxl/utils/indexed_list.py new file mode 100644 index 00000000..753acf09 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/openpyxl/utils/indexed_list.py @@ -0,0 +1,49 @@ +# Copyright (c) 2010-2024 openpyxl + + +class IndexedList(list): + """ + List with optimised access by value + Based on Alex Martelli's recipe + + http://code.activestate.com/recipes/52303-the-auxiliary-dictionary-idiom-for-sequences-with-/ + """ + + _dict = {} + + def __init__(self, iterable=None): + self.clean = True + self._dict = {} + if iterable is not None: + self.clean = False + for idx, val in enumerate(iterable): + self._dict[val] = idx + list.append(self, val) + + def _rebuild_dict(self): + self._dict = {} + idx = 0 + for value in self: + if value not in self._dict: + self._dict[value] = idx + idx += 1 + self.clean = True + + def __contains__(self, value): + if not self.clean: + self._rebuild_dict() + return value in self._dict + + def index(self, value): + if value in self: + return self._dict[value] + raise ValueError + + def append(self, value): + if value not in self._dict: + self._dict[value] = len(self) + list.append(self, value) + + def add(self, value): + self.append(value) + return self._dict[value] |