code: def _concatenate_join_units(
      join_units: list[JoinUnit], copy: bool
  ) -> ArrayLike:
      """
      Concatenate values from several join units along axis=1.
      """
      empty_dtype = _get_empty_dtype(join_units)
  
      has_none_blocks = any(
          unit.block.dtype.kind == "V" for unit in join_units
      )
      upcasted_na = _dtype_to_na_value(empty_dtype, has_none_blocks)
  
      to_concat = [
          ju.get_reindexed_values(
              empty_dtype=empty_dtype, upcasted_na=upcasted_na
          )
          for ju in join_units
      ]
  
      if len(to_concat) == 1:
          # Only one block, nothing to concatenate.
          concat_values = to_concat[0]
          if copy:
              if isinstance(concat_values, np.ndarray):
                  # non-reindexed (=not yet copied) arrays are made into a view
                  # in JoinUnit.get_reindexed_values
                  if concat_values.base is not None:
                      concat_values = concat_values.copy()
              else:
                  concat_values = concat_values.copy()
  
      elif any(is_1d_only_ea_dtype(t.dtype) for t in to_concat):
          # TODO(EA2D): special case not needed if all EAs used HybridBlocks
  
          # error: No overload variant of "__getitem__" of "ExtensionArray" matches
          # argument type "Tuple[int, slice]"
          to_concat = [
              t
              if is_1d_only_ea_dtype(t.dtype)
              else t[0, :]  # type: ignore[call-overload]
              for t in to_concat
          ]
          concat_values = concat_compat(
              to_concat, axis=0, ea_compat_axis=True
          )
          concat_values = ensure_block_shape(concat_values, 2)
  
      else:
          concat_values = concat_compat(to_concat, axis=1)
  
      return concat_values
  
imports: from __future__ import annotations
  import copy
  import itertools
  from typing import TYPE_CHECKING, Sequence, cast
  import numpy
  from pandas._libs import NaT, internals
  from pandas._libs.missing import NA
  from pandas._typing import ArrayLike, AxisInt, DtypeObj, Manager, Shape
  from pandas.util._decorators import cache_readonly
  from pandas.core.dtypes.astype import astype_array
  from pandas.core.dtypes.cast import ensure_dtype_can_hold_na, find_common_type, np_find_common_type
  from pandas.core.dtypes.common import is_1d_only_ea_dtype, is_dtype_equal, is_scalar, needs_i8_conversion
  from pandas.core.dtypes.concat import concat_compat
  from pandas.core.dtypes.dtypes import DatetimeTZDtype, ExtensionDtype
  from pandas.core.dtypes.missing import is_valid_na_for_dtype, isna, isna_all
  import pandas.core.algorithms
  from pandas.core.arrays import DatetimeArray, ExtensionArray
  from pandas.core.arrays.sparse import SparseDtype
  from pandas.core.construction import ensure_wrapped_if_datetimelike
  from pandas.core.internals.array_manager import ArrayManager, NullArrayProxy
  from pandas.core.internals.blocks import ensure_block_shape, new_block_2d
  from pandas.core.internals.managers import BlockManager
label_desc: Use image node_id 7 for calling a global function with example usage: _concatenate_join_units(join_units, copy) and returns: concat_values