import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

public class StreamGenerator {

    public static void main(String[] args) {
        // iterate dua argumen: nilai benih + fungsi langkah berikutnya
        Stream<Integer> kenaikanHarga = Stream.iterate(10000, harga -> harga + 5000);
        System.out.println("iterate 2-arg : " + kenaikanHarga.limit(4).toList());

        // iterate tiga argumen (Java 9+): benih + syarat lanjut + fungsi langkah
        Stream<Integer> tanggaDiskon = Stream.iterate(5, diskon -> diskon <= 30, diskon -> diskon * 2);
        System.out.println("iterate 3-arg : " + tanggaDiskon.toList());

        // generate: Supplier bebas yang tidak melihat nilai sebelumnya
        AtomicInteger nomor = new AtomicInteger(1);
        Stream<String> pesanan = Stream.generate(() -> "Pesanan-" + nomor.getAndIncrement());
        System.out.println("generate      : " + pesanan.limit(3).toList());

        // builder: merakit stream tahap demi tahap, lalu build()
        Stream<String> menu = Stream.<String>builder()
                .add("Kopi Susu")
                .add("Teh Tarik")
                .add("Roti Bakar")
                .build();
        System.out.println("builder       : " + menu.toList());
    }
}
