code: def concat(left, right):
      """Concatenate two cyclers.
  
      The keys must match exactly.
  
      This returns a single Cycler which is equivalent to
      `itertools.chain(left, right)`
  
      Examples
      --------
  
      >>> num = cycler('a', range(3))
      >>> let = cycler('a', 'abc')
      >>> num.concat(let)
      cycler('a', [0, 1, 2, 'a', 'b', 'c'])
  
      Parameters
      ----------
      left, right : `Cycler`
          The two `Cycler` instances to concatenate
  
      Returns
      -------
      ret : `Cycler`
          The concatenated `Cycler`
      """
      if left.keys != right.keys:
          msg = "\n\t".join(
              [
                  "Keys do not match:",
                  "Intersection: {both!r}",
                  "Disjoint: {just_one!r}",
              ]
          ).format(
              both=left.keys & right.keys,
              just_one=left.keys ^ right.keys,
          )
  
          raise ValueError(msg)
  
      _l = left.by_key()
      _r = right.by_key()
      return reduce(add, (_cycler(k, _l[k] + _r[k]) for k in left.keys))
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import six
  from itertools import product, cycle
  from six.moves import zip, reduce
  from operator import mul, add
  import copy
label_desc: Use image node_id 2 for calling a global function with example usage: concat(left, right) and returns: reduce