// "Fix all 'Stream API call chain can be replaced with loop' problems in file" "true"

import java.util.function.Supplier;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Main {
  public static IntSummaryStatistics test() {
    return Stream.iterate("", x -> x + "a").limit(20).mapToInt(x -> x.length()).summaryStati<caret>stics();
  }

  public static List<String> testUseName() {
    return Stream.iterate("", x -> x /* add "a" */ + "a").limit(/*limit*/20).collect(Collectors.toList());
  }

  public static IntSummaryStatistics testNested() {
    return IntStream.range(0, 20).flatMap(limit -> Stream.iterate("", x -> x + limit).limit(limit).mapToInt(x -> x.length())).summaryStatistics();
  }

  private static List<String> testNestedUseName() {
    return IntStream.range(0, 20).mapToObj(x -> x)
      .flatMap(x -> Stream.iterate("", str -> "a"+str).limit(x))
      .collect(Collectors.toList());
  }

  public static IntSummaryStatistics testNestedRename() {
    return IntStream.range(0, 20).filter(x -> x > 2).flatMap(limit -> Stream.iterate(String.valueOf(limit), x -> x + limit).limit(limit).mapToInt(x -> x.length())).summaryStatistics();
  }

  static void print(Supplier<String> messageSupplier) {
    System.out.println(messageSupplier.get());
  }

  public static void main(String[] args) {
    System.out.println(test());
    System.out.println(testUseName());
    System.out.println(testNested());
    System.out.println(testNestedRename());
    System.out.println(String.join("|", testNestedUseName()).length());

    IntStream.range(1, 2)  // convert to loop
      .filter(x -> x > 0)
      .forEach(i -> {
        print(() -> "attempt #" + i);
      });

    IntStream.range(1, 2)  // convert to loop
      .filter(x -> x > 0)
      .map(x -> x + 1)
      .forEach(i -> {
        print(() -> "attempt #" + i);
      });
  }
}