docs: def concat(cls, variables, dim='concat_dim', positions=None,
                 shortcut=False):
          """Concatenate variables along a new or existing dimension.
  
          Parameters
          ----------
          variables : iterable of Array
              Arrays to stack together. Each variable is expected to have
              matching dimensions and shape except for along the stacked
              dimension.
          dim : str or DataArray, optional
              Name of the dimension to stack along. This can either be a new
              dimension name, in which case it is added along axis=0, or an
              existing dimension name, in which case the location of the
              dimension is unchanged. Where to insert the new dimension is
              determined by the first variable.
          positions : None or list of integer arrays, optional
              List of integer arrays which specifies the integer positions to
              which to assign each dataset along the concatenated dimension.
              If not supplied, objects are concatenated in the provided order.
          shortcut : bool, optional
              This option is used internally to speed-up groupby operations.
              If `shortcut` is True, some checks of internal consistency between
              arrays to concatenate are skipped.
  
          Returns
          -------
          stacked : Variable
              Concatenated Variable formed by stacking all the supplied variables
              along the given dimension.
          """
          if not isinstance(dim, str):
              dim, = dim.dims
  
          # can't do this lazily: we need to loop through variables at least
          # twice
          variables = list(variables)
          first_var = variables[0]
  
          arrays = [v.data for v in variables]
  
          if dim in first_var.dims:
              axis = first_var.get_axis_num(dim)
              dims = first_var.dims
              data = duck_array_ops.concatenate(arrays, axis=axis)
              if positions is not None:
                  # TODO: deprecate this option -- we don't need it for groupby
                  # any more.
                  indices = nputils.inverse_permutation(
                      np.concatenate(positions))
                  data = duck_array_ops.take(data, indices, axis=axis)
          else:
              axis = 0
              dims = (dim,) + first_var.dims
              data = duck_array_ops.stack(arrays, axis=axis)
  
          attrs = OrderedDict(first_var.attrs)
          encoding = OrderedDict(first_var.encoding)
          if not shortcut:
              for var in variables:
                  if var.dims != first_var.dims:
                      raise ValueError('inconsistent dimensions')
                  utils.remove_incompatible_items(attrs, var.attrs)
  
          return cls(dims, data, attrs, encoding)