def METHOD_NAME(
    function: Callable[..., _ReturnType],
    argspec,
    args: tuple,
    kwargs: dict,
) -> Union[_ReturnType, Callable[..., _ReturnType]]:
    """
    Internal ``curry`` implementation.
    The interesting part about it is that it return the result
    or a new callable that will return a result at some point.
    """
    intermediate, full_args = _intermediate_argspec(argspec, args, kwargs)
    if full_args is not None:
        return function(*full_args[0], **full_args[1])
    # We use closures to avoid names conflict between
    # the function args and args of the curry implementation.
    def decorator(*inner_args, **inner_kwargs):
        return METHOD_NAME(function, intermediate, inner_args, inner_kwargs)
    return wraps(function)(decorator)