docs: private <T> Collection<Integer> transformFeedback(FeedbackTransformation<T> iterate) {
  
  		if (iterate.getFeedbackEdges().size() <= 0) {
  			throw new IllegalStateException("Iteration " + iterate + " does not have any feedback edges.");
  		}
  
  		StreamTransformation<T> input = iterate.getInput();
  		List<Integer> resultIds = new ArrayList<>();
  
  		// first transform the input stream(s) and store the result IDs
  		Collection<Integer> inputIds = transform(input);
  		resultIds.addAll(inputIds);
  
  		// the recursive transform might have already transformed this
  		if (alreadyTransformed.containsKey(iterate)) {
  			return alreadyTransformed.get(iterate);
  		}
  
  		// create the fake iteration source/sink pair
  		Tuple2<StreamNode, StreamNode> itSourceAndSink = streamGraph.createIterationSourceAndSink(
  			iterate.getId(),
  			getNewIterationNodeId(),
  			getNewIterationNodeId(),
  			iterate.getWaitTime(),
  			iterate.getParallelism(),
  			iterate.getMaxParallelism(),
  			iterate.getMinResources(),
  			iterate.getPreferredResources());
  
  		StreamNode itSource = itSourceAndSink.f0;
  		StreamNode itSink = itSourceAndSink.f1;
  
  		// We set the proper serializers for the sink/source
  		streamGraph.setSerializers(itSource.getId(), null, null, iterate.getOutputType().createSerializer(env.getConfig()));
  		streamGraph.setSerializers(itSink.getId(), iterate.getOutputType().createSerializer(env.getConfig()), null, null);
  
  		// also add the feedback source ID to the result IDs, so that downstream operators will
  		// add both as input
  		resultIds.add(itSource.getId());
  
  		// at the iterate to the already-seen-set with the result IDs, so that we can transform
  		// the feedback edges and let them stop when encountering the iterate node
  		alreadyTransformed.put(iterate, resultIds);
  
  		// so that we can determine the slot sharing group from all feedback edges
  		List<Integer> allFeedbackIds = new ArrayList<>();
  
  		for (StreamTransformation<T> feedbackEdge : iterate.getFeedbackEdges()) {
  			Collection<Integer> feedbackIds = transform(feedbackEdge);
  			allFeedbackIds.addAll(feedbackIds);
  			for (Integer feedbackId: feedbackIds) {
  				streamGraph.addEdge(feedbackId,
  						itSink.getId(),
  						0
  				);
  			}
  		}
  
  		String slotSharingGroup = determineSlotSharingGroup(null, allFeedbackIds);
  
  		itSink.setSlotSharingGroup(slotSharingGroup);
  		itSource.setSlotSharingGroup(slotSharingGroup);
  
  		return resultIds;
  	}