code: def concat(
      left: Cycler[K, V], right: Cycler[K, U]
  ) -> Cycler[K, V | U]:
      r"""
      Concatenate `Cycler`\s, as if chained using `itertools.chain`.
  
      The keys must match exactly.
  
      Examples
      --------
      >>> num = cycler('a', range(3))
      >>> let = cycler('a', 'abc')
      >>> num.concat(let)
      cycler('a', [0, 1, 2, 'a', 'b', 'c'])
  
      Returns
      -------
      `Cycler`
          The concatenated cycler.
      """
      if left.keys != right.keys:
          raise ValueError(
              "Keys do not match:\n"
              "\tIntersection: {both!r}\n"
              "\tDisjoint: {just_one!r}".format(
                  both=left.keys & right.keys,
                  just_one=left.keys ^ right.keys,
              )
          )
      _l = cast(Dict[K, List[Union[V, U]]], left.by_key())
      _r = cast(Dict[K, List[Union[V, U]]], right.by_key())
      return reduce(add, (_cycler(k, _l[k] + _r[k]) for k in left.keys))
  
imports: from __future__ import annotations
  from collections.abc import Hashable, Iterable, Generator
  import copy
  from functools import reduce
  from itertools import product, cycle
  from operator import mul, add
  from typing import TypeVar, Generic, Callable, Union, Dict, List, Any, overload, cast
label_desc: Use image node_id 2 for calling a global function with example usage: concat(left, right) and returns: reduce