hdl.ast: factor out _MappedKeyDict, _MappedKeySet. NFC.
This commit is contained in:
parent
f1e390cbc9
commit
8c4de99c0d
|
@ -884,6 +884,92 @@ class Passive(Statement):
|
||||||
return "(passive)"
|
return "(passive)"
|
||||||
|
|
||||||
|
|
||||||
|
class _MappedKeyCollection(metaclass=ABCMeta):
|
||||||
|
@abstractmethod
|
||||||
|
def _map_key(self, key):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def _unmap_key(self, key):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class _MappedKeyDict(MutableMapping, _MappedKeyCollection):
|
||||||
|
def __init__(self, pairs=()):
|
||||||
|
self._storage = OrderedDict()
|
||||||
|
for key, value in pairs:
|
||||||
|
self[key] = value
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
key = None if key is None else self._map_key(key)
|
||||||
|
return self._storage[key]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
key = None if key is None else self._map_key(key)
|
||||||
|
self._storage[key] = value
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
key = None if key is None else self._map_key(key)
|
||||||
|
del self._storage[key]
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
for key in self._storage:
|
||||||
|
if key is None:
|
||||||
|
yield None
|
||||||
|
else:
|
||||||
|
yield self._unmap_key(key)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if not isinstance(other, type(self)):
|
||||||
|
return False
|
||||||
|
if len(self) != len(other):
|
||||||
|
return False
|
||||||
|
for ak, bk in zip(sorted(self._storage), sorted(other._storage)):
|
||||||
|
if ak != bk:
|
||||||
|
return False
|
||||||
|
if self._storage[ak] != other._storage[bk]:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self._storage)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
pairs = ["({!r}, {!r})".format(k, v) for k, v in self.items()]
|
||||||
|
return "{}([{}])".format(type(self).__name__, ", ".join(pairs))
|
||||||
|
|
||||||
|
|
||||||
|
class _MappedKeySet(MutableSet, _MappedKeyCollection):
|
||||||
|
def __init__(self, elements=()):
|
||||||
|
self._storage = OrderedDict()
|
||||||
|
for elem in elements:
|
||||||
|
self.add(elem)
|
||||||
|
|
||||||
|
def add(self, value):
|
||||||
|
self._storage[self._map_key(value)] = None
|
||||||
|
|
||||||
|
def update(self, values):
|
||||||
|
for value in values:
|
||||||
|
self.add(value)
|
||||||
|
|
||||||
|
def discard(self, value):
|
||||||
|
if value in self:
|
||||||
|
del self._storage[self._map_key(value)]
|
||||||
|
|
||||||
|
def __contains__(self, value):
|
||||||
|
return self._map_key(value) in self._storage
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
for key in [k for k in self._storage]:
|
||||||
|
yield self._unmap_key(key)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self._storage)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "{}({})".format(type(self).__name__, ", ".join(repr(x) for x in self))
|
||||||
|
|
||||||
|
|
||||||
class ValueKey:
|
class ValueKey:
|
||||||
def __init__(self, value):
|
def __init__(self, value):
|
||||||
self.value = Value.wrap(value)
|
self.value = Value.wrap(value)
|
||||||
|
@ -966,71 +1052,11 @@ class ValueKey:
|
||||||
return "<{}.ValueKey {!r}>".format(__name__, self.value)
|
return "<{}.ValueKey {!r}>".format(__name__, self.value)
|
||||||
|
|
||||||
|
|
||||||
class ValueDict(MutableMapping):
|
class ValueDict(_MappedKeyDict):
|
||||||
def __init__(self, pairs=()):
|
_map_key = ValueKey
|
||||||
self._inner = dict()
|
_unmap_key = lambda self, key: key.value
|
||||||
for key, value in pairs:
|
|
||||||
self[key] = value
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
key = None if key is None else ValueKey(key)
|
|
||||||
return self._inner[key]
|
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
|
||||||
key = None if key is None else ValueKey(key)
|
|
||||||
self._inner[key] = value
|
|
||||||
|
|
||||||
def __delitem__(self, key):
|
|
||||||
key = None if key is None else ValueKey(key)
|
|
||||||
del self._inner[key]
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return map(lambda x: None if x is None else x.value, sorted(self._inner))
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
if not isinstance(other, ValueDict):
|
|
||||||
return False
|
|
||||||
if len(self) != len(other):
|
|
||||||
return False
|
|
||||||
for ak, bk in zip(self, other):
|
|
||||||
if ValueKey(ak) != ValueKey(bk):
|
|
||||||
return False
|
|
||||||
if self[ak] != other[bk]:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self._inner)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
pairs = ["({!r}, {!r})".format(k, v) for k, v in self.items()]
|
|
||||||
return "ValueDict([{}])".format(", ".join(pairs))
|
|
||||||
|
|
||||||
|
|
||||||
class ValueSet(MutableSet):
|
class ValueSet(_MappedKeySet):
|
||||||
def __init__(self, elements=()):
|
_map_key = ValueKey
|
||||||
self._inner = set()
|
_unmap_key = lambda self, key: key.value
|
||||||
for elem in elements:
|
|
||||||
self.add(elem)
|
|
||||||
|
|
||||||
def add(self, value):
|
|
||||||
self._inner.add(ValueKey(value))
|
|
||||||
|
|
||||||
def update(self, values):
|
|
||||||
for value in values:
|
|
||||||
self.add(value)
|
|
||||||
|
|
||||||
def discard(self, value):
|
|
||||||
self._inner.discard(ValueKey(value))
|
|
||||||
|
|
||||||
def __contains__(self, value):
|
|
||||||
return ValueKey(value) in self._inner
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return map(lambda x: x.value, sorted(self._inner))
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self._inner)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "ValueSet({})".format(", ".join(repr(x) for x in self))
|
|
||||||
|
|
Loading…
Reference in a new issue