code: def foreach(layer, drop_factor=1.0):
      
  
      def foreach_fwd(docs, drop=0.0):
          sents = []
          lengths = []
          for doc in docs:
              doc_sents = [sent for sent in doc if len(sent)]
              subset = [
                  s for s in doc_sents if numpy.random.random() >= drop * drop_factor
              ]
              if subset:
                  sents.extend(subset)
                  lengths.append(len(subset))
              else:
                  numpy.random.shuffle(doc_sents)
                  sents.append(doc_sents[0])
                  lengths.append(1)
          flat, bp_flat = layer.begin_update(sents, drop=0.0)
          output = layer.ops.unflatten(flat, lengths)
  
          def foreach_bwd(d_output, sgd=None):
              d_flat = layer.ops.flatten(d_output)
              d_sents = bp_flat(d_flat, sgd=sgd)
              if d_sents is None:
                  return d_sents
              else:
                  return layer.ops.unflatten(d_sents, lengths)
  
          return output, foreach_bwd
  
      model = wrap(foreach_fwd, layer)
  
      def _run_foreach_child_hooks(model, X, y):
          for layer in model._layers:
              for hook in layer.on_data_hooks:
                  hook(layer, X[0], y[0])
  
      model.on_data_hooks = [_run_foreach_child_hooks]
  
      return model
docs: Map a layer across list items