Source code for gigl.common.collections.sorted_dict
from collections.abc import Mapping
from typing import TypeVar
[docs]
class SortedDict(Mapping[KT, VT]):
"""Sorted Dictionary implementation
Given a dictionary, sorts it by keys when iterating over it
"""
def __init__(self, *args, **kwargs):
self.__dict = dict(*args, **kwargs)
self.__needs_memoization = True
self.__sort_dict_if_needed()
def __len__(self):
return len(self.__dict)
def __getitem__(self, key):
return self.__dict[key]
def __eq__(self, other: object) -> bool:
"""Check equality against another object
Args:
other (object): Dictionary like object or SortedDict
Returns:
bool: Returns true if the current instance of frozen dict matches the
other dictionary / frozen dict
"""
if not isinstance(other, Mapping):
return False
if len(self) != len(other):
return False
for self_key, self_val in self.items():
if self_key not in other:
return False
if self_val != other[self_key]:
return False
return True
def __setitem__(self, key, value):
if key not in self.__dict:
self.__needs_memoization = True
self.__dict[key] = value
def __delitem__(self, key):
del self.__dict[key]
def __sort_dict_if_needed(self):
if self.__needs_memoization:
self.__dict = dict(sorted(self.__dict.items(), key=lambda item: item[0]))
self.__needs_memoization = False
def __iter__(self):
self.__sort_dict_if_needed()
return iter(self.__dict)
def __repr__(self):
self.__sort_dict_if_needed()
return self.__dict.__repr__()