code: private <T> T processFunction(SplitFunction<T> function) {
  		synchronized (splits) {
  			if (splits.isEmpty()) {
  				return null;
  			}
  			for (Split split : splits) {
  				function.evaluate(split);
  			}
  			return function.result();
  		}
  	}
docs: Evaluate a function over the list of splits.
  
  @param <T> Function result type
  @param function Function to evaluate
  @return Function result, null if no splits