"""
registers.py - manage registers
"""
from typing import Dict
from .oops import InvalidNameError
from .stack import StackItem
[docs]class Registry:
"""
The Registry stores the values of esc registers. It's basically a fancy
dictionary with some validation and a display-sorted :meth:`items` method.
"""
def __init__(self):
self._registers: Dict[str, StackItem] = {}
def __bool__(self):
return bool(self._registers)
[docs] def __contains__(self, value):
return value in self._registers
[docs] def __len__(self):
return len(self._registers)
[docs] def __getitem__(self, key):
return self._registers[key]
[docs] def __setitem__(self, key, value):
"""
Set the value of a register.
:raises: :class:`InvalidNameError <esc.oops.InvalidNameError>`
if the key (register name) isn't valid.
"""
if not self._valid_name(key):
raise InvalidNameError(
"Register names must be uppercase or lowercase letters.")
self._registers[key] = value
[docs] def __delitem__(self, key):
del self._registers[key]
[docs] @staticmethod
def _valid_name(name: str):
"A key (register name) is valid if it's exactly one alphabetic character."
return len(name) == 1 and name.isalpha()
[docs] def items(self):
"Return an iterable of items, sorted by register key."
return sorted(self._registers.items(), key=lambda i: i[0])
[docs] def values(self):
return self._registers.values()