# Principled Programming / Tim Teitelbaum / Chapter 18.
class Pair[K, V]:
    """Generic pairs."""
    # Representation
    _key: K
    _value: V

    # Constructor.
    def __init__(self, k: K, v: V) -> None:
        self._key = k;
        self._value = v

    # Access.self.
    def get_key(self) -> K:
        return self._key

    def get_value(self) -> V:
        return self._value

    # String representation.
    def __str__(self) -> str:
        return "<" + str(self._key) + "," + str(self._value) + ">"

    # Equality.
    def __eq__(self, other) -> bool:
        if other is None: return False
        if other is self: return True
        if not isinstance(other, Pair): return False
        return (self._key == other._key) and (self._value == other._value)