def _do_merge(self, global_value, local_value):
token_global = self._token_of(global_value)<EOL>token_local = self._token_of(local_value)<EOL>if token_global != token_local:<EOL><INDENT>return self._prefer_local(global_value, local_value)<EOL><DEDENT>elif self.TOKEN.PRIMITIVE == token_global == token_local:<EOL><INDENT>return self._prefer_local(global_value, local_value)<EOL><DEDENT>elif self.TOKEN.DICT == token_global == token_local:<EOL><INDENT>return self._merge_dict(global_value, local_value)<EOL><DEDENT>elif self.TOKEN.LIST == token_global == token_local:<EOL><INDENT>return self._merge_lists(global_value, local_value)<EOL><DEDENT>else:<EOL><INDENT>raise TypeError(<EOL>"<STR_LIT>".format(token_global, token_local))<EOL><DEDENT>
Actually perform the merge operation for the given inputs. This method is used as part of the recursion.
Therefore input values can be of any type. So is the output.

:param global_value: Global value to be merged
:param local_value: Local value to be merged
:return: Merged result