code: def update_types(config, reference, list_sep=':'):
      
  
      def _coerce(current, value):
          # Coerce a value to the `current` type.
          try:
              # First we try to apply current to the value, since it
              # might be a function
              return current(value)
          except TypeError:
              # Then we check if current is a list AND if the value
              # is a string.
              if isinstance(current, list) and isinstance(value, str):
                  # If so, we use the colon as the separator
                  return value.split(list_sep)
  
              try:
                  # If we are here, we should try to apply the type
                  # of `current` to the value
                  return type(current)(value)
              except TypeError:
                  # Worst case scenario we return the value itself.
                  return value
  
      def _update_type(value, path):
          current = reference
  
          for elem in path:
              try:
                  current = current[elem]
              except KeyError:
                  return value
  
          return _coerce(current, value)
  
      return map_leafs(_update_type, config)
docs: Return a new configuration where all the values types
      are aligned with the ones in the default configuration