from typing import Any, Optional


class SharedCache:
    """
    Singleton cache for storing data.
    Only one instance will exist regardless of how many times it's instantiated.
    """

    _instance = None
    _cache: dict[str, Any]

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance._cache = {}
        return cls._instance

    def get_cache(self) -> dict[str, Any]:
        return self._cache

    def get(self, key: str) -> Optional[Any]:
        """
        Retrieves a value from the cache using the provided key.
        """
        if not isinstance(key, str):
            raise TypeError("Key must be a string")
        return self._cache.get(key)

    def put(self, key: str, value: Any):
        """
        Stores a value in the cache.
        """
        if not isinstance(key, str):
            raise TypeError("Key must be a string")
        self._cache[key] = value

    def clear(self) -> None:
        """
        Clears all cached values.
        """
        self._cache.clear()
