from typing import Union, TypeVar

from nonebot.adapters import Event
from nonebot.matcher import Matcher
from nonebot.params import Received, LastReceived


async def matcher(m: Matcher) -> Matcher:
    return m


async def legacy_matcher(matcher):
    return matcher


async def not_legacy_matcher(matcher: int):
    ...


class FooMatcher(Matcher):
    ...


async def sub_matcher(m: FooMatcher) -> FooMatcher:
    return m


class BarMatcher(Matcher):
    ...


async def union_matcher(
    m: Union[FooMatcher, BarMatcher]
) -> Union[FooMatcher, BarMatcher]:
    return m


M = TypeVar("M", bound=Matcher)


async def generic_matcher(m: M) -> M:
    return m


CM = TypeVar("CM", Matcher, None)


async def generic_matcher_none(m: CM) -> CM:
    return m


async def not_matcher(m: Union[int, Matcher]):
    ...


async def receive(e: Event = Received("test")) -> Event:
    return e


async def last_receive(e: Event = LastReceived()) -> Event:
    return e