code: def freeze(o):
      
      typ = type(o)
      if typ is dict:
          return pmap(dict((k, freeze(v)) for k, v in six.iteritems(o)))
      if typ is list:
          return pvector(map(freeze, o))
      if typ is tuple:
          return tuple(map(freeze, o))
      if typ is set:
          return pset(o)
      return o
docs: Recursively convert simple Python containers into pyrsistent versions
      of those containers.
  
      - list is converted to pvector, recursively
      - dict is converted to pmap, recursively on values (but not keys)
      - set is converted to pset, but not recursively
      - tuple is converted to tuple, recursively.
  
      Sets and dict keys are not recursively frozen because they do not contain
      mutable data by convention. The main exception to this rule is that
      dict keys and set elements are often instances of mutable objects that
      support hash-by-id, which this function can't convert anyway.
  
      >>> freeze(set([1, 2]))
      pset([1, 2])
      >>> freeze([1, {'a': 3}])
      pvector([1, pmap({'a': 3})])
      >>> freeze((1, []))
      (1, pvector([]))