code: def xarray_var_iter(data, var_names=None, combined=False, skip_dims=None, reverse_selections=False):
      
      if skip_dims is None:
          skip_dims = set()
  
      if combined:
          skip_dims = skip_dims.union({"chain", "draw"})
      else:
          skip_dims.add("draw")
  
      if var_names is None:
          if isinstance(data, xr.Dataset):
              var_names = list(data.data_vars)
          elif isinstance(data, xr.DataArray):
              var_names = [data.name]
              data = {data.name: data}
  
      for var_name in var_names:
          if var_name in data:
              new_dims = [dim for dim in data[var_name].dims if dim not in skip_dims]
              vals = [purge_duplicates(data[var_name][dim].values) for dim in new_dims]
              dims = [{k: v for k, v in zip(new_dims, prod)} for prod in product(*vals)]
              if reverse_selections:
                  dims = reversed(dims)
  
              for selection in dims:
                  yield var_name, selection, data[var_name].sel(**selection).values
docs: Convert xarray data to an iterator over vectors.
  
      Iterates over each var_name and all of its coordinates, returning the 1d
      data.
  
      Parameters
      ----------
      data : xarray.Dataset
          Posterior data in an xarray
  
      var_names : iterator of strings (optional)
          Should be a subset of data.data_vars. Defaults to all of them.
  
      combined : bool
          Whether to combine chains or leave them separate
  
      skip_dims : set
          dimensions to not iterate over
  
      reverse_selections : bool
          Whether to reverse selections before iterating.
  
      Returns
      -------
      Iterator of (str, dict(str, any), np.array)
          The string is the variable name, the dictionary are coordinate names to values,
          and the array are the values of the variable at those coordinates.