code: def product(self, projection=None):
          
          if self.empty():
              if projection:
                  return projection(1)
              else:
                  return 1
          if self.size() == 1:
              if projection:
                  return projection(self.first())
              else:
                  return self.first()
  
          if projection:
              return self.map(projection).reduce(mul)
          else:
              return self.reduce(mul)
docs: Takes product of elements in sequence.
  
          >>> seq([1, 2, 3, 4]).product()
          24
  
          >>> seq([]).product()
          1
  
          >>> seq([(1, 2), (1, 3), (1, 4)]).product(lambda x: x[0])
          1
  
          :param projection: function to project on the sequence before taking the product
          :return: product of elements in sequence