code: def map(self, map_fn, specs=None, clone=True):
          
          if specs is not None and not isinstance(specs, (list, set, tuple)):
              specs = [specs]
          applies = specs is None or any(self.matches(spec) for spec in specs)
  
          if self._deep_indexable:
              deep_mapped = self.clone(shared_data=False) if clone else self
              for k, v in self.items():
                  new_val = v.map(map_fn, specs, clone)
                  if new_val is not None:
                      deep_mapped[k] = new_val
              if applies: deep_mapped = map_fn(deep_mapped)
              return deep_mapped
          else:
              return map_fn(self) if applies else self
docs: Map a function to all objects matching the specs
  
          Recursively replaces elements using a map function when the
          specs apply, by default applies to all objects, e.g. to apply
          the function to all contained Curve objects:
  
              dmap.map(fn, hv.Curve)
  
          Args:
              map_fn: Function to apply to each object
              specs: List of specs to match
                  List of types, functions or type[.group][.label] specs
                  to select objects to return, by default applies to all
                  objects.
              clone: Whether to clone the object or transform inplace
  
          Returns:
              Returns the object after the map_fn has been applied