code: def zip(self, enumerable, func):
          
          if not isinstance(enumerable, Enumerable):
              raise TypeError()
          return Enumerable(itertools.izip(self, enumerable)).select(lambda x: func(x))
docs: Merges 2 Enumerables using the given function. If the 2 collections are of unequal length, then
          merging continues until the end of one of the collections is reached
          :param enumerable: Enumerable collection to merge with
          :param func: a function to perform the merging
          :return: Enumerable