# Principled Programming / Tim Teitelbaum / Chapter 18.
from intpair import Pair

# Fraction
"""Fraction using int pairs."""
class Fraction(Pair):
    # Constructor.
    def __init__(self, numerator: int, denominator: int) -> None:
        super().__init__(numerator, denominator)  # Apply the Pair constructor.
        assert denominator != 0, "0 denominator"
    
    # Access.
    def get_numerator(self)   -> int: return self._key
    def get_denominator(self) -> int: 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, Fraction): return False;
        return (self._key == other._key) and (self._value == other._value)