code: def concatenate_lists(*layers, **kwargs):  # pragma: no cover
      
      if not layers:
          return noop()
      drop_factor = kwargs.get("drop_factor", 1.0)
      ops = layers[0].ops
      layers = [chain(layer, flatten) for layer in layers]
      concat = concatenate(*layers)
  
      def concatenate_lists_fwd(Xs, drop=0.0):
          drop *= drop_factor
          lengths = ops.asarray([len(X) for X in Xs], dtype="i")
          flat_y, bp_flat_y = concat.begin_update(Xs, drop=drop)
          ys = ops.unflatten(flat_y, lengths)
  
          def concatenate_lists_bwd(d_ys, sgd=None):
              return bp_flat_y(ops.flatten(d_ys), sgd=sgd)
  
          return ys, concatenate_lists_bwd
  
      model = wrap(concatenate_lists_fwd, concat)
      return model
docs: Compose two or more models `f`, `g`, etc, such that their outputs are
      concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))`