def METHOD_NAME(
    self,
    resource_id: str,
    start_time: datetime.datetime,
    end_time: datetime.datetime,
    skip_token: Optional[str] = None,
    **kwargs
) -> AsyncIterable["_models.ChangeList"]:
    """List the changes of a resource within the specified time range. Customer data will be masked if the user doesn't have access.
    List the changes of a resource within the specified time range. Customer data will be masked if
    the user doesn't have access.
    :param resource_id: The identifier of the resource.
    :type resource_id: str
    :param start_time: Specifies the start time of the changes request.
    :type start_time: ~datetime.datetime
    :param end_time: Specifies the end time of the changes request.
    :type end_time: ~datetime.datetime
    :param skip_token: A skip token is used to continue retrieving items after an operation returns
     a partial result. If a previous response contains a nextLink element, the value of the nextLink
     element will include a skipToken parameter that specifies a starting point to use for
     subsequent calls.
    :type skip_token: str
    :keyword callable cls: A custom type or function that will be passed the direct response
    :return: An iterator like instance of either ChangeList or the result of cls(response)
    :rtype: ~azure.core.async_paging.AsyncItemPaged[~Microsoft.ChangeAnalysis.models.ChangeList]
    :raises: ~azure.core.exceptions.HttpResponseError
    """
    cls = kwargs.pop('cls', None)  # type: ClsType["_models.ChangeList"]
    error_map = {
        401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
    }
    error_map.update(kwargs.pop('error_map', {}))
    api_version = "2021-04-01"
    accept = "application/json"
    def prepare_request(next_link=None):
        # Construct headers
        header_parameters = {}  # type: Dict[str, Any]
        header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
        if not next_link:
            # Construct URL
            url = self.METHOD_NAME.metadata['url']  # type: ignore
            path_format_arguments = {
                'resourceId': self._serialize.url("resource_id", resource_id, 'str'),
            }
            url = self._client.format_url(url, **path_format_arguments)
            # Construct parameters
            query_parameters = {}  # type: Dict[str, Any]
            query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
            query_parameters['$startTime'] = self._serialize.query("start_time", start_time, 'iso-8601')
            query_parameters['$endTime'] = self._serialize.query("end_time", end_time, 'iso-8601')
            if skip_token is not None:
                query_parameters['$skipToken'] = self._serialize.query("skip_token", skip_token, 'str')
            request = self._client.post(url, query_parameters, header_parameters)
        else:
            url = next_link
            query_parameters = {}  # type: Dict[str, Any]
            request = self._client.get(url, query_parameters, header_parameters)
        return request
    async def extract_data(pipeline_response):
        deserialized = self._deserialize('ChangeList', pipeline_response)
        list_of_elem = deserialized.value
        if cls:
            list_of_elem = cls(list_of_elem)
        return deserialized.next_link or None, AsyncList(list_of_elem)
    async def get_next(next_link=None):
        request = prepare_request(next_link)
        pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
        response = pipeline_response.http_response
        if response.status_code not in [200]:
            error = self._deserialize(_models.ErrorResponse, response)
            map_error(status_code=response.status_code, response=response, error_map=error_map)
            raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat)
        return pipeline_response
    return AsyncItemPaged(
        get_next, extract_data
    )