<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def playlist_songs_move( 		self, 		playlist_songs, 		*, 		after=None, 		before=None, 		index=None, 		position=None 	):
 		"""Move songs in a playlist. 		Note: 			* Provide no optional arguments to move to end. 			* Provide playlist song dicts for ``after`` and/or ``before``. 			* Provide a zero-based ``index``. 			* Provide a one-based ``position``. 			Songs are inserted *at* given index or position. 			It's also possible to move to the end by using 			``len(songs)`` for index or ``len(songs) + 1`` for position. 		Parameters: 			playlist_songs (list):
 A list of playlist song dicts. 			after (dict, Optional):
 A playlist song dict ``songs`` will follow. 			before (dict, Optional):
 A playlist song dict ``songs`` will precede. 			index (int, Optional):
 The zero-based index position to insert ``songs``. 			position (int, Optional):
 The one-based position to insert ``songs``. 		Returns: 			dict: Playlist dict including songs. 		"""


		if not more_itertools.all_equal(
			playlist_song['playlistId']
			for playlist_song in playlist_songs
		):
			raise ValueError(
				"All 'playlist_songs' must be from the same playlist."
			)

		playlist = self.playlist(
			playlist_songs[0]['playlistId'],
			include_songs=True
		)

		prev, next_ = get_ple_prev_next(
			playlist['tracks'],
			after=after,
			before=before,
			index=index,
			position=position
		)

		playlist_songs_len = len(playlist_songs)
		for i, playlist_song in enumerate(playlist_songs):
			mutation = mc_calls.PlaylistEntriesBatch.update(
				playlist_song,
				preceding_entry_id=prev.get('id'),
				following_entry_id=next_.get('id')
			)
			response = self._call(mc_calls.PlaylistEntriesBatch, mutation)
			result = response.body['mutate_response'][0]

			# TODO: Proper exception on failure.
			if result['response_code'] != 'OK':
				break

			if i < playlist_songs_len - 1:
				while True:
					prev = self.playlist_song(result['id'])
					if prev:
						break

		return self.playlist(playlist_songs[0]['playlistId'], include_songs=True)