# Principled Programming / Tim Teitelbaum / Chapter 18.
from typing import NoReturn

class HashSet[E]:
    """Generic HashSet using set."""
    _A: set[E]     # ArrayList elements are in A[0..size-1]

    # Constructor.
    def __init__(self, m: int = 20) -> None:
        if m < 0: raise ValueError("Capacity must be non-negative int")
        self._A = set[E]()

    # Iteration
    def __iter__(self):
        self._iterator = iter(self._A)
        return self
    def __next__(self):
        return next(self._iterator)

    # Size.
    def size(self)    -> int:  return len(self._A)
    def is_empty(self) -> bool: return len(self._A) == 0

    # Access.
    def get(self, k: int) -> NoReturn:
        assert False, "get not supported"
    def set(self, k: int, v: E) -> NoReturn:
        assert False, "set not supported"

    # Insertion / Deletion.
    def add(self, v: E, k: int = -1) -> None:
        self._A.add(v)
    def remove(self, k: int) -> NoReturn:
        assert False, "remove by index not supported"
    def remove_by_value(self, v: E) -> bool:
        try:
            self._A.remove(v)
            return True
        except ValueError:
            return False

     # Capacity.
    def ensure_capacity(self, min_capacity: int) -> None: pass

    # Membership.
    def index_of(self, v: E) -> NoReturn:
        assert False, "index_of not supported"

    def contains(self, v: E) -> bool:
        print("self._A:", self._A)
        return v in self._A