# Path: aioreactive/types.py
# class AsyncObserver(Generic[T_contra]):
#     """An asynchronous observable."""
# 
#     __slots__ = ()
# 
#     @abstractmethod
#     async def asend(self, value: T_contra) -> None:
#         raise NotImplementedError
# 
#     @abstractmethod
#     async def athrow(self, error: Exception) -> None:
#         raise NotImplementedError
# 
#     @abstractmethod
#     async def aclose(self) -> None:
#         raise NotImplementedError


import logging
from typing import Any, Optional, TypeVar
from .types import AsyncObserver


TSource = TypeVar("TSource")

log = logging.getLogger(__name__)


def noop(*args: Any, **kw: Any) -> None:
    """No operation. Returns nothing"""
    pass


async def anoop(value: Optional[Any] = None):
    """Async no operation. Returns nothing"""
    pass



# Path: aioreactive/types.py
# class AsyncObserver(Generic[T_contra]):
#     """An asynchronous observable."""
# 
#     __slots__ = ()
# 
#     @abstractmethod
#     async def asend(self, value: T_contra) -> None:
#         raise NotImplementedError
# 
#     @abstractmethod
#     async def athrow(self, error: Exception) -> None:
#         raise NotImplementedError
# 
#     @abstractmethod
#     async def aclose(self) -> None:
#         raise NotImplementedError


# Path: aioreactive/utils.py
import logging
from typing import Any, Optional, TypeVar
from .types import AsyncObserver



TSource = TypeVar("TSource")

log = logging.getLogger(__name__)


def noop(*args: Any, **kw: Any) -> None:
    """No operation. Returns nothing"""
    pass


async def anoop(value: Optional[Any] = None):
    """Async no operation. Returns nothing"""
    pass



class NoopObserver(AsyncObserver[TSource]):