'Perform an inline map/reduce operation on this collection.
Perform the map/reduce operation on the server in RAM. A result
collection is not created. The result set is returned as a list
of documents.
If `full_response` is ``False`` (default) returns the
result documents in a list. Otherwise, returns the full
response from the server to the `map reduce command`_.
The :meth:`inline_map_reduce` method obeys the :attr:`read_preference`
of this :class:`Collection`.
:Parameters:
- `map`: map function (as a JavaScript string)
- `reduce`: reduce function (as a JavaScript string)
- `full_response` (optional): if ``True``, return full response to
this command - otherwise just return the result collection
- `**kwargs` (optional): additional arguments to the
`map reduce command`_ may be passed as keyword arguments to this
helper method, e.g.::
>>> db.test.inline_map_reduce(map, reduce, limit=2)
.. versionchanged:: 3.4
Added the `collation` option.'

def inline_map_reduce(self, map, reduce, full_response=False, **kwargs):

    cmd = SON([('mapreduce', self.__name), ('map', map), ('reduce', reduce), ('out', {'inline': 1})])
    collation = validate_collation_or_none(kwargs.pop('collation', None))
    cmd.update(kwargs)
    with self._socket_for_reads() as (sock_info, slave_ok):
        if ((sock_info.max_wire_version >= 4) and ('readConcern' not in cmd)):
            res = self._command(sock_info, cmd, slave_ok, read_concern=self.read_concern, collation=collation)
        else:
            res = self._command(sock_info, cmd, slave_ok, collation=collation)
    if full_response:
        return res
    else:
        return res.get('results')
