docs: def omnihash(obj):
      """ recursively hash unhashable objects """
      if isinstance(obj, set):
          return hash(frozenset(omnihash(e) for e in obj))
      elif isinstance(obj, (tuple, list)):
          return hash(tuple(omnihash(e) for e in obj))
      elif isinstance(obj, dict):
          return hash(frozenset((k, omnihash(v)) for k, v in obj.items()))
      else:
          return hash(obj)